【问题标题】:Unexpected pipe() behaviour意外的 pipe() 行为
【发布时间】:2017-10-20 19:07:02
【问题描述】:

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

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

【问题讨论】:

  • 请在询问有关运行时问题的问题时(就像这个问题一样)发布干净编译的代码(发布的代码甚至不是整个程序,当然不会编译)发布实际输入,发布预期输出,发布实际输出。
  • write() 函数可以返回 -1。发生这种情况时,发生了错误。应该检查 -1 并调用 perror() 当返回值为 0 时,应该循环尝试并输出其余数据。请阅读write() 的手册页,特别是:“成功时,返回写入的字节数(零表示未写入任何内容)。如果此数字小于请求的字节数;这可能会发生,例如因为磁盘设备已满。另请参阅 NOTES。"
  • 子进程应该调用exit(),而不仅仅是在'if'代码块的末尾运行(这意味着子进程将在else代码块结束后执行任何操作,即可能不是你想要的。

标签: c linux pipe fork posix


【解决方案1】:

问题是在调用 fork 之后调用 pipe。所以父母和孩子得到不同的管道副本。在调用 fork 之前将调用移至 pipe。

【讨论】:

  • 啊,我知道这件事,但我没有注意到我的错误。我应该时刻关注它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 2016-07-16
  • 2016-05-10
  • 2020-07-23
  • 2021-08-23
  • 2021-11-16
  • 2016-06-29
相关资源
最近更新 更多