• ベストアンサー
  • 困ってます

名前付きパイプを使い文字列をブロードキャスト

名前付きパイプを利用して、文字列をブロードキャストしたいと考えています。 --- シェル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) その場合、親子関係なくプロセス間で、複数のプロセスに対して同一の文字列をブロードキャスト方法は、どのようにすればスマートでしょうか。 一度、通常ファイルに出力を書き込み、全プロセスが文字列を取得した事を監視してキューを削除する、みたいな方法は可能だと思いますが、これよりも良い方法があればお教えください。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数946
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • ki073
  • ベストアンサー率77% (491/634)

タイトルにあるように名前付きパイプを作れば良いのですが、 シェル1$ mkfifo fifo1 fifo2 cat|tee fifo1 >fifo2 シェル2$ cat fifo1 シェル3$ cat fifo2 不要になったfifo1 fifo2はあとで消しておく必要があります。 プロセス置換という方法もあります。(こちらは、名前付きパイプ プロセス置換で検索すればでてきます)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。プロセス置換という方法もあるんですね。早速、勉強いたします。

その他の回答 (1)

  • 回答No.2
  • notnot
  • ベストアンサー率47% (4699/9895)

>Q1) 名前付きパイプ fifo は、その名のとおり、「早い者勝ち」でデータを取得した方にしかデータが流れないんでしょうか。 誰かがデータを読むということは、パイプからデータを取り出してしまうと言うことです。無くなったデータは読めません。 >Q2) その場合、親子関係なくプロセス間で、複数のプロセスに対して同一の文字列をブロードキャスト方法は、どのようにすればスマートでしょうか。 複数のプロセスというのが、最初から決まっている物ならその相手プロセスごとに別々の名前付きパイプを作るのが簡単です。 複数のプロセスというのが、動的に増えたり減ったりするならば、 案1:ファイルやデータベース、共有メモリなど、読んでも無くならない物を使う 案2:相手プロセスが増減するたびに、専用の名前付きパイプを作ったり削除したりする処理を作り込む 案はまだありそうですけど。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。大変勉強になりました。

関連するQ&A

  • awkで可変文字列をマッチング

    シェルなどでawkを使う際に、シェルの引数として渡された文字列をawkに渡し、それを条件にマッチングをかけたいのですが、どうしたら良いのでしょうか?(まあ、素直にgrepを使えばいいのですが・・・) 例えば、 cat foo.txt | awk '{if ($2 == ptn) print}' ptn=$<シェルの引数> とかやれば、2番目のフィールドに完全に一致する行が抽出できるのですが、 cat foo.txt | awk '/ptn/ {print}' ptn=$<シェルの引数> とかやっても、"ptn"という文字列をマッチングしてしまうので、うまくいきません。どの位置に出現するかわからないけど、シェルの引数で指定された文字列が含まれている行だけを出力したい場合、どうしたらよいのでしょう・・・。

  • 文字列から1文字取り出すには?

    XP。studio.netです。 文字列から1文字ずつ取り出したいのですがどうしたらいいのでしょうか。 今 「テストは90点だった。」 「helloと言ってました。」 と言うような1バイト文字と2バイト文字が混合した文字列があるとします。 このような文字列から1文字ずつ文字を取り出すにはどうしたらいいでしょうか。 やりたいことは文字列の文章を一瞬で表示するのではなく、 タタタタと0.01秒に1文字ずつ表示するような表示の仕方がやりたいのです。

  • 文字列の問題なのですが

    大学の問題なのですが、 「 : 」をいくつか含む文字列(半角のみ、漢字は含めない)で初期化した文字配列がある。 その文字列を「 : 」で分割し、分割した文字列を 1 行に 1 つずつ出力するプログラムを作成しなさい。 【出力例】  Hello  Good-Bye  Thank you プログラムソース(編集可) #include <stdio.h> int main(void) { char str[30] = "Hello:Good-Bye:Thank you"; //ここからプログラムを記述してください } 自分でやらないと力が付かないのは承知なのですが、明後日試験の為、間に合わないので、教えてください。お願いします

  • VB 選択中の文字列の両端に文字列を挿入する

    現在VisualBasicで簡易のhtmlタグを編集できるようなものを作っています。 そこで一つ困ったことがあるのですが、 選択中の文字列の両端に文字列を挿入することができません。 イメージとしては、 Hello, World! という文字列を選択中に ボタンを押して<b>Hello,World!</b>のように変えるような感じです。 どうか回答よろしくお願いします。

  • 文字列に\nを入れたい

    データベースAccessからデータを取得しTextFieldにその取得したデータを表示させたのですが、文字数が長くてTextFieldに収まらなくなっしてしまいました。そこで取得した文字列に新たに\nを入れて改行させようとしています。 String str = "文字列40字以上…" if(str.length >= 40){ ***処理内容*** 文字列が40字以上なら40文字目のすぐ後ろに\nを足して改行させて表示させたい。 ただし、40文字目を区切りとして改行させ表示させる。例)96文字なら3行に表示させるようにする。 } このような処理を行いたいのですが、良い方法がわかりません。アドバイスをお願いします。

  • 文字列中からある文字列とある文字列の間にある文字列を取得

    表題にあるとおり間の文字列をどうやって取得するべきかと悩んでいます・・ abcdefghijklmn・・・ となっているとき bとe、aとkなど間の間隔が不定なときはどのようにして文字列を取得したらよいのでしょうか? 最初の2文字は与えられているとして考えています。 インターネットのURLで言うなら/から/までの間の文字列と言うことになります。 今私が考えているのは strchrで位置のアドレスを取得してそこからfor文かwhile文で指定の2文字目が出るまでまわすのかなぁ・・と思っています。 ですが具体的にどのような感じに書けばいいのかがわかりません。どなたかご教授ください。

  • 画面から文字列を取得してその文字列の位置を知る方法

    こんばんは。 質問させてください。 画面から文字列を選択して、取得します。(これは出来ました。) その文字列がHTMLソースファイルの どの位置のものか取得する方法はありますでしょうか? ○番目の「こんばんは」を画面から取得した時に 同じ文字列があっても、○番目の位置が取得出来る方法なのですが・・・ ---- <HTML><HEAD></HEAD> <BODY> おはよう、こんばんは。 さようなら、ありがとう。 しつれいしました、おはよう、こんばんは。 こんばんは、さようなら。 さようなら </BODY> </HTML> ----

  • 文字列から\0を外したい

    文字列(わかりやすいように16進で表現します)から\0を外すには どのようにしたらよいでしょうか? 文字列が、61,62,63,64,20,00,67,68,69 とある場合、これを、61,62,63,64,20,67,68,69 としたいのですが、何かいい方法はありませんでしょうか?

  • 文字列の長さを知りたい

    文字列を表示した場合文字によって幅が違うので 文字数×一つの文字の幅で文字列の長さがでません 文字列の長さがでないとエジタを作る場合に カレットをどこにおいていいのかわかりません (例えばフォントによってはiiiよりwwwの方が長い) 文字列の長さを知る方法はないのでしょうか?

  • 文字列の操作

    こんにちは。 以下のような、文字列があるとします。 NUMBER1(ヌル\0)からNUMBER1000(ヌル\0)までの文字列があるとします。 NUMBERは付属で、ほしい文字列が1から1000までNUMBERの次にある場合、1から1000までを取得する方法として、 Buf[100] int x=0; while(Buf[x]!='\0') //ナル文字までの長さを取得 x++; memmove(&Buf[0],Buf[x-1],4); //NUMBER1の場合、長さは7。しかしほしい文字列は第6要素なのでx-1。 しかし・・・これを行うと、 NUMBER10:長さ8 NUMBER100:長さ9 ・ ・ となり、二桁以上の場合は、memmove(&Buf[0],Buf[x-2],4)と、 第2引数を手動で可変しなければなりません。 そこで、NUMBER\01\0 NUMBER\01000\0というように、 NUMBERの次にヌル文字(あってますでしょうか?)\0を挿入し、次の要素に1から1000まで文字列を挿入。そして文字列終端が分かるように再度\0を挿入します。 しかしこのような場合、ヌルを2つ挿入することで、上記に示したプログラムでは、手前の\0までしか長さを取得しないので、うまくいきません。 そこで、文字列の区切りを示すための方法として、なにかありますでしょうか? 文字列は最後に、\0を挿入することで判別すると書いてありますが、 NUMBERVISUALC++\0というような文字列を配列に格納してある場合、 NUMBERとVISUALC++をどのように分けて取得するのでしょうか? それとも、第6要素から取得した文字列があると言う事が分かっている場合、第6要素からを指定するプログラムを作るということになるのでしょうか? よろしくお願いします。