6

私はOCamlにかなり慣れておらず、OCaml内から外部プログラムを呼び出す方法を見つけようとしていました。

私はここのドキュメントに従い、次の呼び出しを行っています:

Unix.execv "cat text_file";;

これにより、次が返されます。

string array -> 'a = <fun>

返された無名関数にどの程度正確にアクセスできますか?

cat text_fileファイルの内容を印刷する単純な試みですが、実際に実行したいコマンドはもう少し複雑です。ただし、これを実行できれば、実際のプログラムを実行できるはずだと思います。

4

2 に答える 2

11

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

ただし、多くの場合、実際に必要なsystemのは、ではありませんexecv

これsystemにより、必要に応じて単一の文字列を渡すことができ、execv(とは異なりsystem)決して戻らないことに注意してください。つまりexecv、プログラムを呼び出すと、呼び出したアプリケーションがプロセスを引き継ぎます。

于 2010-12-03T22:27:00.313 に答える
9

sepp2kが言ったことに加えて、create_process(Unix.file_descrの場合)またはopen_process(チャネルの場合)の使用を検討することをお勧めします。これらの関数はfork/execを実行し、プロセスのi/oをリダイレクトします。そうすれば、ではできないプロセスと通信できますsystem

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

于 2010-12-03T23:39:48.383 に答える