题
我是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
(对于unix.file_descr)或 open_process
(用于频道)。这些函数可以进行叉/exec,并将I/O重定向到该过程。这样您就可以与该过程进行交流,而您无法与 system
.
如果您想阅读的输出 cat
在您的程序中,您可以使用 pipe
函数,然后使用返回的file_descrs create_process
.
不隶属于 StackOverflow