代码之家  ›  专栏  ›  技术社区  ›  Nidhoegger

管道返回0,但read_fd设置为0

  •  0
  • Nidhoegger  · 技术社区  · 4 年前

    我有一个程序,它使用 pipe 在linux中创建可以与以下对象结合使用的事件 epoll 。这些事件有时会被删除,然后重新创建。在其中一个电话中 返回0(成功),但在文件描述符的数组中,读取fd(索引0)设置为0,在写入fd(索引1)时,我得到 SIGPIPE 。我在任何地方都没有找到任何关于这方面的内容,即使创建一个小测试程序也不会重现这个问题。

    管道的创建方式如下:

        int fd[2] = {};
    
        const int err (pipe(fd));
        if (err)
        {
            printf("Error creating pipe (%d)\n", errno);
        }
    
        int read_fd = fd[0];
        int write_fd = fd[1];
    

    这种行为是否有任何记录,或者有人知道可能导致这种情况的原因吗?

    0 回复  |  直到 4 年前
        1
  •  0
  •   Daniel Zin    4 年前

    假设:

    • 您显式或隐式地关闭了标准输入( close(0); fclose(stdin); )在实际调用pipe()之前
    • 因此,描述符0被认为是“自由的”,并用作fd[0],即创建的管道的读取端
    • 然后,您将再次显式或隐式地执行 关闭(0);
    • 因此,您的管道具有封闭的读取侧
    • 最后,当您尝试写入fd[1]时,在读取端关闭的情况下,您会得到预期的SIGPIPE。

    如果这个假设是正确的,您需要了解谁会定期(至少两次)关闭当前流程的描述符0