从OCaml内部调用外部程序

时间:2010-12-03 22:20:25

标签: unix ocaml execv

我对OCaml很陌生,并试图弄清楚如何从OCaml中调用外部程序。

我一直在关注文档here,并进行以下调用:

Unix.execv "cat text_file";;

返回以下内容:

string array -> 'a = <fun>

我究竟如何访问返回的匿名函数?

cat text_file是打印文件内容的简单尝试,我实际想要运行的命令有点复杂。但是,我认为如果我可以运行,我应该可以让我的实际程序运行。

2 个答案:

答案 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