2010-12-03 29 views
6

我對OCaml很新,想弄清楚如何從OCaml中調用外部程序。從OCaml中調用一個外部程序

我一直在下面的文檔here,並做以下電話:

Unix.execv "cat text_file";; 

這將返回以下:

string array -> 'a = <fun> 

究竟如何訪問返回的匿名函數?

cat text_file是一個簡單的嘗試來打印文件的內容,其實我是想運行的命令是更復雜一點。但是,我認爲如果我能夠運行,我應該能夠運行真正的程序。

回答

10

的第一個參數是execv要運行的程序,第二個是包含參數數組。另外,execv需要程序的完整路徑;您可以使用execvp在執行路徑中查找程序。此外,程序的第一個參數是程序本身的名稱。 所以你想"/bin/cat"作爲第一個參數,而不是"cat text_file"[| "cat"; "text_file" |]作爲第二個參數(或調用execvp和通過"cat"作爲第一個參數)。

然而,往往不是你真正想要system,不execv

注意system讓你像你想傳遞一個字符串和execv(不像system)永遠不會返回,即一旦你撥打execv你的程序做,你調用應用程序接管過程。

8

除了sepp2k所說的內容之外,您可能還想考慮使用create_process(對於Unix.file_descr)或open_process(對於通道)。這些函數執行fork/exec並重定向進程的I/O。通過這種方式,您可以與流程進行溝通,您無法通過system進行溝通。

如果要在程序中讀取cat的輸出,可以使用pipe函數創建管道,然後使用返回的file_descrs獲取create_process