質問: 名前付きパイプを使い文字列をブロードキャスト 名前付きパイプを利用して、文字列をブロードキャストしたいと考えています。 --- シェル1$ cat > fifo --- シェル2$ cat fifo --- シェル3$ cat fifo --- のような状態で、シェル 1 で hello と入力し、enter キーを押下すると、シェル 2 およびシェル 3 に hello と表示させたいのですが、実際にはシェル 3 (後から fifo を開いたシェル)にしか印字されません。 シェル 1 にて入力を終了(eof送信)すると、シェル 2 、シェル 3 ともにファイルがクローズされ、cat が終了しているので、eof は両方ともにブロードキャストされているようにも見え、動きが不可解です。 q1) 名前付きパイプ fifo は、その名のとおり、「早い者勝ち」でデータを取得した方にしかデータが流れないんでしょうか。 q2) その場合、親子関係なくプロセス間で、複数のプロセスに対して同一の文字列をブロードキャスト方法は、どのようにすればスマートでしょうか。 一度、通常ファイルに出力を書き込み、全プロセスが文字列を取得した事を監視してキューを削除する、みたいな方法は可能だと思いますが、これよりも良い方法があればお教えください。
回答: タイトルにあるように名前付きパイプを作れば良いのですが、 シェル1$ mkfifo fifo1 fifo2 cat|tee fifo1 >fifo2 シェル2$ cat fifo1 シェル3$ cat fifo2 不要になったfifo1 fifo2はあとで消しておく必要があります。 プロセス置換という方法もあります。(こちらは、名前付きパイプ プロセス置換で検索すればでてきます)