stdin
両方のプログラムのANDを「クロス」する方法は?特に、インタラクティブなtic-tac-toeゲーム、tic-tac-toeとtic-tac-toestdout
という2つのプログラムがあります。それらはすべて表示する位置を示す数字(0〜8)を出力し、ユーザーが表示したい場所を表す別の数字(0〜8)を期待します。これらの2つの違いは、最初に動くものと後で動くことです。インタラクティブなユーザーにとっては、すべてうまく機能します。 ioリダイレクトを使用して互いに対話させることはできますか?pgm1
pgm2
pgm1
pgm2
私は次のようなものを無駄に試しました。
pgm2
別の端末(入力待ち)で開き、そのpidを見つけます。その後、pgm1
別の端末で実行します。./pgm1 < /proc/pid_pgm2/fd/1 > /proc/pid_pgm2/fd/0
- たとえば、mkfifoを使用して2つのパイプを作成し、
pipe1
2pipe2
つの異なる端末で次のコマンドを実行しました./pgm1 < pipe1 > pipe2
。./pgm2 < pipe2 > pipe1
- 上記の両方を試してpgm2の前にpgm1を実行し、pgm1の前にpgm2を実行
します。fflush(stdout)
printf()
誰が私が何を見逃しているのか、または何が間違っているのか、またはこれが可能かどうかを教えてください。
答え1
FIFOとパイプと連携できるようにする必要があります。
$ mkfifo fifo
$ ./pgm2 < fifo | ./pgm1 > fifo
プログラム2の入力はfifo、出力はパイプです。プログラムの入力はパイプで、出力はfifoです。
しかし注意してください。これは通常非常にアクティブであり、プロセス間の「ping / ポン」が完璧でないとデッドロックにつながる可能性があります。
このスタックオーバーフローの質問も参照してください。2番目のプロセスの標準出力を1番目のプロセスの標準入力にリダイレクトするにはどうすればよいですか?
答え2
あなたは行き届いた路地にいます:./pgm1 < pipe1 > pipe2
そして./pgm2 < pipe2 > pipe1
open("pipe1", O_RDONLY)
以前にシェルが実行した操作は、他のものが同じパイプにpgm1
書き込まれるまでブロックされます。open
これが完了するまで、追加の手順は実行されませんopen("pipe2", O_WRONLY)
。
反対側も同じです。他のシェルが作成者を待っているため、ブロックされて完了open("pipe2", O_RDONLY)
しないため、デッドロックが発生します。open("pipe2", O_WRONLY)
pipe1
あなたは書いたことがありますか?
pgm1 < pipe1 > pipe2 & pgm2 > pipe1 < pipe2
動作します。
Linuxでは、次のように書くこともできます。
{ pgm1 <&3 3<&- | pgm2 3<&-; } 3< /dev/fd/1 | :