2

そのままでは変更できないプログラムがあり、それを実行し、いくつかのデータを標準入力に書き込み、自動化されたプログラム的な方法で標準出力から回答を取得する必要があります。これを行う最も簡単な方法は何ですか?

この擬似Cコードのようなものだと思います

char input_data_buffer[] = "calculate 2 + 2\nsay 'hello world!'";
char output_data_buffer[MAX_BUF];
IPCStream ipcs = executeIPC("./myprogram", "rw");
ipcs.write(input_data_buffer);
ipcs.read(output_data_buffer);
...

PS: 私は popen を考えましたが、知る限り、Linux には一方向のパイプしかありません。

編集:

1メッセージずつの通信になると思われます。まず親側が入力を子プロセスの stdin に送信し、次に子が出力を stdout に提供して終了し、その間に親が stdout を読み取ります。通信の終了について: 子プロセスが終了すると、EOF ターミネータが stdout に送信されるため、親は子が終了したかどうかを正確に知ることができます。

通常、このプログラム (親) - 学生のソリューション テスター。CLI から他の 2 つの実行可能ファイルへのパスを取得します。1 つ目はテストする学生のプログラムで、2 つ目はエタロンが正しく動作するプログラムで、まったく同じ問題を解決します。

学生プログラムの入力/出力は厳密に指定されているため、テスターは両方のプログラムを実行し、多数のランダムな入力についてその出力を比較します。すべての不一致が報告されます。

入力/出力の最大サイズは数百キロバイトと推定されます

例: ..挿入ソート アルゴリズムを実装する ... 最初の行にはシーケンスの長さがあります ... 2 行目には一連の数値 a_i があります |a_i| < 2^31 - 1... 出力の最初の行はすべての要素の合計である必要があり、2 行目はソートされたシーケンスでなければなりません。

入力:

5
1 3 4 6 2

期待される出力:

16
1 2 3 4 6
4

3 に答える 3

4

高度な Linux プログラミング(少なくとも 1 つの章全体があなたの質問に答えている)を読んで、 execve(2)fork(2)waitpid(2)pipe(2)dup2(2)poll(2)について詳しく学んでください。 ...

pollプログラムの入力と出力を多重化する(少なくともシングルスレッドプログラムでは)必要があることに注意してください。そうしないと、デッドロックが発生する可能性があります。子プロセスがプログラムへの書き込みをブロックされ (出力パイプがいっぱいであるため)、プログラムがそこからの読み取りをブロックされる可能性があります (入力パイプが空のため)。

ところで、プログラムに何らかのイベント ループがある場合は、それが役立つ可能性があります (実際にpollは単純なイベント ループの基礎を提供しています)。また、Glib (GTK から) はプロセスを生成する機能を提供し、Qt にはQProcessがあり、libeventはそれらを認識しています。

于 2013-10-25T20:25:03.177 に答える