2016-04-13 2 views
0

こんにちは私は私のCプログラムにいくつかの問題があります。目標はforkに2回あり、pipeのデータを子2から子1に渡してから、子1から親にいくつかの異なるデータを渡し、最終的に親に印刷します。ここに私のコードは次のとおりです。cフォークパイプと読み取りfuncntionはファイル記述子からランダムなバイトを与えます

int main(void) 
{ 
    int f,f2,nread; 
    int pfd[2], pfd2[2]; 
    char buffer[512], *str; 

    if(pipe(pfd)==-1) { 
     errorHandler("pipe"); 
    } 

    if((f=fork())==-1) { 
     errorHandler("fork 1"); 
    } else if(f == 0) { 
     /*child 1*/ 
     if(pipe(pfd2)==-1) { 
      errorHandler("pipe 2"); 
     } 
     if((f2=fork())==-1) { 
      errorHandler("fork 2"); 
     } else if(f2 == 0) { 
      /*child 2*/ 
      close(pfd[0]); 
      close(pfd[1]); 
      close(pfd2[0]); 
      str = "rollin"; 
      printf("-child 2 writing: %s\n", str); 
      if(write(pfd2[1], &str, BUFFSIZE)==-1) { 
       errorHandler("write 2"); 
      } 
     } else { 
      /*child 1*/ 
      close(pfd[0]); 
      close(pfd2[1]); 
      if((nread=read(pfd2[0], &buffer, 512))==-1) { 
       errorHandler("read child 1"); 
      } 

      buffer[nread] = 0; 
      printf("child 1 read data %d [%s]\n", nread, buffer); 

      str = "patrollin patrolling hehe"; 
      printf("-child 1 writing %s\n", str); 
      if(write(pfd[1], &str, BUFFSIZE)==-1) { 
       errorHandler("write"); 
      } 
     } 
    } else { 
     /*parent*/ 
     close(pfd[1]); 
     if((nread=read(pfd[0], buffer, sizeof(buffer)))==-1) { 
      errorHandler("read"); 
     } else { 
      buffer[nread] = 0; 
      printf("parent read data: %d [%s]\n", nread, buffer); 
     } 
    } 

    return 0; 
} 

出力は、データが読み込まれていることである(私は指定された512バイトとして)それは私が送信したものではありません。私は代わりにメモリからいくつかのランダムな兆候を取る(ファイルディスクリプタは適切にpasseedされていますか?)。 私がここに来た理由は、これに何が間違っているのか分かりません。私は1つのフォークと同様のアクションを持つプログラムを持っており、それは同じテクニックに基づいており、動作しています。誰かが私に何か間違っていることをヒントを与えることができますか?

答えて

0

readの2番目の引数は、バッファへのポインタです。 writeの2番目の引数は、書き込むデータへのポインタです。だから、

read(pfd2[0], buffer, 512) 

write(pfd2[1], str, BUFFSIZE) 
を使用する必要があります
関連する問題