我对OCaml很陌生,并试图弄清楚如何从OCaml中调用外部程序.
我一直在这里关注文档,并拨打以下电话:
Unix.execv "cat text_file";;
Run Code Online (Sandbox Code Playgroud)
这将返回以下内容:
string array -> 'a = <fun>
Run Code Online (Sandbox Code Playgroud)
我究竟如何访问返回的匿名函数?
cat text_file是一个简单的尝试打印文件的内容,我实际想要运行的命令有点复杂.但是,我认为如果我可以运行,我应该能够让我的真实程序运行.
sep*_*p2k 11
第一个参数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(对于通道).这些函数执行fork/exec并重定向进程的i/o.这样您就可以与流程进行通信,而这是您无法做到的system.
如果要读取程序中的输出cat,可以使用该pipe函数创建管道,然后使用返回的file_descrs create_process.