Unix 从OCaml中调用外部程序
我对OCaml还很陌生,我试图弄清楚如何从OCaml内部调用外部程序 我一直在关注文档,并打了以下电话:Unix 从OCaml中调用外部程序,unix,ocaml,execv,Unix,Ocaml,Execv,我对OCaml还很陌生,我试图弄清楚如何从OCaml内部调用外部程序 我一直在关注文档,并打了以下电话: Unix.execv "cat text_file";; 这将返回以下内容: string array -> 'a = <fun> 字符串数组->'a= 如何准确访问返回的匿名函数 cat text\u file是一个简单的打印文件内容的尝试,实际上我想要运行的命令要复杂一些。但是,我假设如果我可以运行这个程序,我应该能够运行我真正的程序。execv的第一个参数是您要
Unix.execv "cat text_file";;
这将返回以下内容:
string array -> 'a = <fun>
字符串数组->'a=
如何准确访问返回的匿名函数
cat text\u file
是一个简单的打印文件内容的尝试,实际上我想要运行的命令要复杂一些。但是,我假设如果我可以运行这个程序,我应该能够运行我真正的程序。execv的第一个参数是您要运行的程序,第二个参数是包含参数的数组。另外,execv
需要程序的完整路径;您可以使用execvp
在执行路径中查找程序。此外,程序的第一个参数是程序本身的名称。
因此,您希望将“/bin/cat”
作为第一个参数,而不是“cat text_file”
,将[|“cat”;“text_file”|]
作为第二个参数(或者调用execvp
并将“cat”
作为第一个参数传递)
但是,通常情况下,您实际上想要的是system
,而不是execv
请注意,
system
允许您按需传递单个字符串,execv
(与system
不同)永远不会返回,也就是说,一旦调用execv
,您的程序就完成了,您调用的应用程序将接管该过程。除了sepp2k所说的,您可能希望研究使用create\u process
(对于Unix.file\u descr)或open\u process
(对于通道)。这些函数执行fork/exec并重定向进程的i/o。这样,您就可以与流程进行通信,而这是系统所无法做到的
如果要在程序中读取cat
的输出,可以使用pipe
函数创建管道,然后使用返回的文件描述create\u process