我是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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top