意外的 pipe() 行为

Unexpected pipe() behaviour

我正在尝试让 2 个进程通过管道进行通信。我等待 child 在管道中写入一个字符,然后 parent 将从管道中读取字符并将其显示在屏幕上。问题是我在管道中成功写入了字符(我做了一个立即读取的测试,我看到它在管道中),但是当 parent 从管道中读取时,什么都没有在里面。我真的不明白为什么;一切似乎都很好。

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]);
}

问题是您在调用 fork 之后调用了 pipe。所以 parent 和 child 得到管道的不同副本。在调用 fork 之前移动对 pipe 的调用。