質問
私はOCAMLをかなり初めてで、OCAML内から外部プログラムを呼び出す方法を見つけようとしていました。
私はドキュメントに従っています ここ, 、および次の呼び出しを行います。
Unix.execv "cat text_file";;
これは次のものを返します:
string array -> 'a = <fun>
返された匿名関数にどのようにアクセスしますか?
cat text_file
ファイルの内容を印刷する簡単な試みであり、実際に実行したいコマンドはもう少し複雑です。しかし、これを実行できれば、実際のプログラムを実行できるはずだと思います。
解決
最初の議論 execv
実行したいプログラムで、2番目は引数を含む配列です。また、 execv
プログラムへのフルパスが必要です。使用できます execvp
実行パスでプログラムを検索します。さらに、プログラムに対する最初の議論は、プログラム自体の名前です。あなたが望んでいるのは "/bin/cat"
最初の議論として、そうではありません "cat text_file"
, 、 と [| "cat"; "text_file" |]
2番目の引数として(または呼び出します execvp
とパス "cat"
最初の議論として)。
しかし、多くの場合、実際に望んでいます system
, 、 いいえ execv
.
ご了承ください system
好きなように単一の文字列を渡すことができます execv
(ようではない system
)戻ってはいけません。つまり、電話をかけたら execv
プログラムが完了し、呼び出したアプリケーションがプロセスを引き継ぎます。
他のヒント
SEPP2Kが言ったことに加えて、あなたは使用を検討したいと思うかもしれません create_process
(unix.file_descrの場合)または open_process
(チャネル用)。これらの関数はフォーク/execを実行し、プロセスのためにI/Oをリダイレクトします。そうすれば、あなたができないプロセスと通信することができます system
.
の出力を読みたい場合 cat
プログラムでは、 pipe
機能し、returned file_descrsを使用します create_process
.