2010-12-03 7 views
6

私はOCamlには新しく、OCaml内から外部プログラムを呼び出す方法を理解しようとしていました。OCaml内から外部プログラムを呼び出す

私はドキュメントhereを以下の、そして次の呼び出しを行ってきた:

Unix.execv "cat text_file";; 

これは以下を返します。

string array -> 'a = <fun> 

私が返された匿名の機能をどのように正確にアクセスできますか?

cat text_fileは、ファイルの内容を簡単に印刷しようとしていますが、実際に実行したいコマンドは少し複雑です。しかし、私はこれを実行することができれば、私は実際のプログラムを稼働させることができるはずです。

答えて

10

execvの最初の引数は実行するプログラムで、2番目の引数は引数を含む配列です。また、execvにはプログラムへのフルパスが必要です。 execvpを使用して、実行パスでプログラムをルックアップすることができます。さらに、プログラムの最初の引数は、プログラム自体の名前です。 "/bin/cat"を第1引数にし、第2引数として"cat text_file"[| "cat"; "text_file" |]を指定しないでください(またはexecvpを呼び出し、最初の引数として"cat"を渡します)。

実際にはsystemを入力する必要があります。execvではありません。あなたのプログラムが行われ、あなたが呼び出すアプリケーションがプロセスを引き継ぎexecv呼び出したらsystemは、あなたが望むようにあなたは、単一の文字列を渡すことができますし、(systemとは異なり)execvは決して戻らないこと、すなわちこと

注意。

8

sepp2kに加えて、create_process(Unix.file_descrの場合)またはopen_process(チャネルの場合)を使用するとよいでしょう。これらの関数はfork/execを実行し、プロセスのI/Oをリダイレクトします。そうすれば、プロセスと通信することができます。これはsystemで行うことはできません。

catの出力をプログラムで読み取る場合は、pipe関数を使用してパイプを作成し、create_processに返されたfile_descrsを使用できます。

関連する問題