2017-05-20 14 views
0

パイプで通信する2つのプロセスを作ろうとしています。私は子供がパイプに文字を書くのを待って、その後、親はパイプからキャラクターを読んでスクリーンに表示します。問題は、私は正常に文字をパイプに書き込むことです(私はすぐにそれを読み取るためのテストを行い、それがパイプに入っているのを見ました)が、親パイプから読み取ると、その内部には何もありません。なぜ私は本当に理解できません。すべてがうまくいくようです。予期しないpipe()の振る舞い

int PID, canal[2]; 
if(-1 == (PID = fork())) 
{ 
    perror("Error"); 
    return 0; 
} 
if(-1 == pipe(canal)) 
{ 
    perror("Error"); 
    return 0; 
} 
if(PID == 0) 
{ 
    close(canal[0]); 
    printf("Child\n"); 
    char buffer = 'C'; 
    if(0 == write(canal[1], &buffer, sizeof(char))) 
     printf("Didn't write anything\n"); 
    close(canal[1]); 
} 
else 
{ 
    char readBuffer; 
    wait(NULL); 
    printf("Parent\n"); 
    close(canal[1]); 
    if(read(canal[0], &readBuffer, sizeof(char))) 
    { 
     printf("I read: "); 
     printf("%c\n", readBuffer); 
    } 
    close(canal[0]); 
} 
+0

実行時の問題については、このコードではっきりとコンパイルされたコード(投稿されたコードはプログラム全体ではなく、確かにコンパイルされません)を入力してください。予想される出力、実際の出力をポストします。 – user3629249

+0

'write()'関数は-1を返すことができます。それが起こると、エラーが発生しました。 -1をチェックして、 'perror()'を呼び出す必要があります。戻り値が0の場合は、ループして残りのデータを出力してください。成功した場合、書き込まれたバイト数が返されます(ゼロは は何も書き込まれていないことを示します)。*この数値が小さい場合は、エラー*ではありません。数字が より小さい場合要求されたバイト数のうち、 ディスクデバイスがいっぱいになったために発生する可能性があります。 – user3629249

+0

子プロセスは 'if'コードブロックの終わりで実行するだけではなく' exit() 'を呼び出す必要があります(つまり、' else'コードブロックの終わりの後に子プロセスが実行されることを意味します。 – user3629249

答えて

5

問題は、forkを呼び出した後にパイプを呼び出すことです。したがって、親と子はパイプの異なるコピーを取得します。コールをフォークする前に、コールをパイプに移動します。

+0

ああ、私はこのことを知っていたが、間違いに気付かなかった。 – Peter

関連する問題