首页 > 解决方案 > 管道返回 0 但 read_fd 设置为 0

问题描述

我有一个pipe在 linux 中使用的程序来创建可以与epoll. 这些事件有时会被删除,然后再重新创建。其中一个调用pipe返回 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];

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

标签: c++linux

解决方案


假设:

  • 在实际调用 pipe() 之前显式或隐式关闭标准输入(close(0); fclose(stdin);
  • 结果,描述符 0 被视为“空闲”并用作 fd[0],即创建管道的读取端
  • 然后你再一次显式或隐式地执行close(0);
  • 结果,您的管道具有封闭的读取侧
  • 最后,当您尝试写入 fd[1] 时,您会按预期获得 SIGPIPE,以防读取端关闭。

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


推荐阅读