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