c++ - 管道返回 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];
这种行为是否记录在案或有人知道可能导致这种情况的原因吗?
解决方案
假设:
- 在实际调用 pipe() 之前显式或隐式关闭标准输入(
close(0);
或fclose(stdin);
) - 结果,描述符 0 被视为“空闲”并用作 fd[0],即创建管道的读取端
- 然后你再一次显式或隐式地执行
close(0);
- 结果,您的管道具有封闭的读取侧
- 最后,当您尝试写入 fd[1] 时,您会按预期获得 SIGPIPE,以防读取端关闭。
如果这个假设是正确的,你需要了解谁会定期(至少两次)关闭你当前进程的描述符 0
推荐阅读
- php - 有人能弄清楚为什么这个 jQuery 正在运行 else 吗?
- python - 使用 pandas.read_csv 读取 csv 时,parse_dates 不起作用
- c++ - 从文件读取几个字节到结构所需的保证
- sql - SQL Server unpivot 或 cross apply 处理空值和多列
- excel - 使用 VBA 脚本将全名解析为部分
- node.js - “dotnet new react”不允许我使用 sass 文件
- python - 如何使用多处理在等待的进程上运行 pexpect?
- sml - 如何编写函数 vmProduct,将大小为 n 的行向量与具有 n 行和 m 列的矩阵相乘以在 SML 中生成大小为 m 的向量
- http - Logical operators in tweepy query
- docker - Docker private registry insufficient_scope when trying to delete image