我对 OCaml 很陌生,并试图弄清楚如何从 OCaml 中调用外部程序。
我一直在关注此处的文档,并进行了以下调用:
Unix.execv "cat text_file";;
这将返回以下内容:
string array -> 'a = <fun>
我究竟如何访问返回的匿名函数?
cat text_file
是打印文件内容的简单尝试,我实际要运行的命令有点复杂。但是,我认为如果我能运行这个程序,我应该能够运行我的真实程序。
第一个参数execv
是您要运行的程序,第二个是包含参数的数组。此外,execv
需要程序的完整路径;您可以使用execvp
在执行路径中查找程序。此外,程序的第一个参数是程序本身的名称。所以你想"/bin/cat"
作为第一个参数,而不是"cat text_file"
作为[| "cat"; "text_file" |]
第二个参数(或作为第一个参数调用execvp
和传递"cat"
)。
然而,很多时候你实际上想要system
的,不是execv
。
请注意,它system
允许您传递您想要的单个字符串,并且execv
(不像system
)永远不会返回,即一旦您调用execv
您的程序完成并且您调用的应用程序将接管该过程。
除了 sepp2k 所说的之外,您可能还想研究使用create_process
(for Unix.file_descr) 或open_process
(for channels)。这些函数执行 fork/exec 并重定向进程的 i/o。这样您就可以与流程进行通信,而您无法使用system
.
如果要cat
在程序中读取 的输出,可以使用该pipe
函数创建一个管道,然后将返回的 file_descrs 用于create_process
.