io「クロス」2つのプログラムにリダイレクト

io「クロス」2つのプログラムにリダイレクト

stdin両方のプログラムのANDを「クロス」する方法は?特に、インタラクティブなtic-tac-toeゲーム、tic-tac-toeとtic-tac-toestdoutという2つのプログラムがあります。それらはすべて表示する位置を示す数字(0〜8)を出力し、ユーザーが表示したい場所を表す別の数字(0〜8)を期待します。これらの2つの違いは、最初に動くものと後で動くことです。インタラクティブなユーザーにとっては、すべてうまく機能します。 ioリダイレクトを使用して互いに対話させることはできますか?pgm1pgm2pgm1pgm2

私は次のようなものを無駄に試しました。

  1. pgm2別の端末(入力待ち)で開き、そのpidを見つけます。その後、pgm1別の端末で実行します。./pgm1 < /proc/pid_pgm2/fd/1 > /proc/pid_pgm2/fd/0
  2. たとえば、mkfifoを使用して2つのパイプを作成し、pipe12pipe2つの異なる端末で次のコマンドを実行しました./pgm1 < pipe1 > pipe2./pgm2 < pipe2 > pipe1
  3. 上記の両方を試して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 | :

関連情報