2016-09-26 17 views
2

私はLinuxでstdin/stdoutと対話できる実行可能ファイルを持っています。私は対話的にこのプログラムを呼び出すことができるC++でプログラムを書こうとしています。標準にコマンドを送り、stdoutをキャプチャします。C++ Linux他のプログラムとやりとりするstdin/stdout

私は本当に混乱してきました。私は自分のプログラムをフォークしたくないのですか?私のプログラムは "クライアント"を開始し、データを送信し、出力を得、より多くのデータを送り、出力を増やし、 "クライアント"を閉じることができるようにしたい。

P.S.はい、私は以前これが尋ねられていると確信していますが、私は本当に正しいキーワードを使用していない、おそらく私の頭を掻いて数時間を費やしました。

+0

低レベルのシステムコールを使用して書きたいのですか、ライブラリを使用できますか? 1つのオプションは、[libexpect](http://docs.activestate.com/activetcl/8.5/expect/libexpect.3.html)を使用することです –

+0

@MarkPlotnickこれは個人的なプロジェクトなので、これを簡単にする方法は、 。 – CircuitGuy

+0

@ MarkPlotnick実際、はい、これは本当にうまくいきます!私はtcl8.6からexp_popen()コールを使用するように切り替えました。これはプロセスを開き、他のファイルと同様に読み書きできるファイルハンドルを返します。 – CircuitGuy

答えて

3

別のプログラムを実行する唯一の方法は、exec()システムコールのいずれかを使用する方法です。これが唯一の方法です。そして、あなたが知っている通り、exec()は、実行プログラムをexec()で指定されたプログラムに置き換えます。 exec()を発行したプロセスはもう存在しません。新しいプログラムではPIDが使用されています。

したがって、プログラムを他の実行可能プログラムに置き換える必要がなければ、プログラムはfork()で、子プロセスはexec()を使用して新しい実行ファイルを実行します。これは、新しいプロセスを開始し、元のプロセスを継続して実行する伝統的な方法です。そのためにはfork()が必要です。

あなたが記述状況はかなり典型的である、ペイント・バイ・ナンバーの状況、それは時間の数え切れないほど行われています:2本のパイプ、パイプで連結された標準入力のための1つを作成するための

  1. 使用パイプ()、 1つはパイプの標準出力です。

  2. fork()を使用します。子プロセスdup2() s stdinパイプの読み込み終了を0、stdoutパイプの書き込み終了を1、元のパイプの両端を閉じ、新しいプロセスをexec()にします。

  3. 親プロセスは、stdinパイプの書き込み終了とstdoutパイプの書き込み終了を使用して、子プロセスと対話します。

+0

非常に良い説明。自分の研究で自分の頭の上を歩いていた部分を埋める。さて、これはずっと前に置き換えられ抽象化されていた恐ろしいインタフェースのように思えます。しかし、助けてくれてありがとう! – CircuitGuy

+0

@CircuitGuy Windowsはこれをよりうまくやっていると思います。 (あなたは 'CreateProcess'を呼び出して、子プロセスがstdinとstdoutに使うハンドルを渡します) – immibis

関連する問題