2016-07-04 1 views
2

私がしようとしているのは、各子供にメッセージを送り、どの子が最初にそれを印刷するかを見ることです。親はどのようにして1つのパイプでn人の子供にメッセージを送信できますか?

int main() 
{ 
    int pfd[2]; 

    if(pipe(pfd)<0){ 
     perror("pfd error"); 
     exit(1); 
    } 

    int n=5; 

    for(int i=1;i<=n;i++){ 
     pid_t pid=fork(); 
     if(pid<0){ 
      perror("fork error\n"); 
      exit(1); 
     } 
     if(pid==0){ 
      close(pfd[1]); 
      char ms[256]; 
      int h; 
      read(pfd[0],&h,sizeof(int)); 
      read(pfd[0],ms,h*sizeof(char)); 
      cout<<i<<"_"<<ms<<endl; 
      close(pfd[0]); 
      exit(0); 
     } 
     if(pid>0){ 
      close(pfd[0]); 
     } 
    } 

    int j=1; 
    char uzenet[256]; 
    strcpy(uzenet,"start"); 
    int ho=strlen(uzenet); 
    while(j<=n){ 
     if(write(pfd[1],&ho,sizeof(int))==-1){ 
      perror("write error"); 
      exit(1); 
     } 
     if(write(pfd[1],uzenet,ho*sizeof(char))==-1){ 
      perror("write error"); 
      exit(1); 
     } 
     j++; 
    } 
    close(pfd[1]); 
    while(wait(NULL)>0){}; 
    exit(0); 
} 

そして、それはこのプリントアウト:

2_ 
1_start 
4_ 
3_ 
5_ 

をしかし、私がしたいことはこれです:

2_start 
1_start 
4_start 
3_start 
5_start 

答えて

2

することができます私は私のコードは次のようになりますので、1本のパイプを使用して試してみました1本のパイプで!

パイプから読み込まれたデータは消費されます。パイプからデータを読み込むと、パイプからデータが読み込まれ、パイプから消えます(水とパイプについて考えると、水が消費されます)。

異なるプロセス間でパイプの読み込み部分を共有すると、それらは同時に発生します。つまり、誰が何らかのデータを読むのを保証することはできません。システムは、ある時点で読書を要求するすべての読者の中から自分が望む読者を選択することができます。最悪の場合、1つのプロセスですべてが読み取られます。一般的に、あなたは一種のランダムな選択肢を持っています。それは無作為ではありませんが、制御することはほとんど不可能です(そして試してみると悪い考えです)。少なくとも、複製部分のN倍のメッセージを複製することは考えておらず、N個の読者がそれぞれ1つのコピーを読むことができることを願っています。

パイプを使用して何かをブロードキャストすることはできません。それを望むなら、あなた自身の放送システムを実装してください。

---また、あなたがそれを必要とする場合は、あなたがそれをシミュレートするために、いくつかのプロトコルを実装する必要があります、パイプデータは何のセマンティックを持っていない、内部メッセージの概念がないことを忘れないでください---

を追加。私はあなたがリットルでパイプを溢れさせることはできませんし、水滴やドリンクを飲むことができないことを意味します。

+0

興味深いことに、興味深いことに1つの子プロセスが ''開始 ''部分を消費するようです。もちろん、あなたの答えは正しいです。 –

+0

だから私はn人の子供のためのnパイプを作成し、それらのすべてに "スタート"を送信する必要がありますか? –

関連する問題