6

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

我一直在关注此处的文档,并进行了以下调用:

Unix.execv "cat text_file";;

这将返回以下内容:

string array -> 'a = <fun>

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

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

4

2 回答 2

11

第一个参数execv是您要运行的程序,第二个是包含参数的数组。此外,execv需要程序的完整路径;您可以使用execvp在执行路径中查找程序。此外,程序的第一个参数是程序本身的名称。所以你想"/bin/cat"作为第一个参数,而不是"cat text_file"作为[| "cat"; "text_file" |]第二个参数(或作为第一个参数调用execvp和传递"cat")。

然而,很多时候你实际上想要system的,不是execv

请注意,它system允许您传递您想要的单个字符串,并且execv(不像system)永远不会返回,即一旦您调用execv您的程序完成并且您调用的应用程序将接管该过程。

于 2010-12-03T22:27:00.313 回答
9

除了 sepp2k 所说的之外,您可能还想研究使用create_process(for Unix.file_descr) 或open_process(for channels)。这些函数执行 fork/exec 并重定向进程的 i/o。这样您就可以与流程进行通信,而您无法使用system.

如果要cat在程序中读取 的输出,可以使用该pipe函数创建一个管道,然后将返回的 file_descrs 用于create_process.

于 2010-12-03T23:39:48.383 回答