c - 如果从管道读取时 tail 失败怎么办

标签 c unix pipe stderr tail

distinguish stdout from stderr on pipe

因此,与上面的链接相关,我有一个正在执行 tail 的 child ,而 parent 正在通过 pipe 读取它的输出。

dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);

我的问题是,如果 tail 以某种方式失败,我正在读取的管道会发生什么情况?我在 stderr 上能得到什么吗? tail 会自行终止吗?或者它可能会作为 defunct 卡在那里?

最佳答案

tail 终止时,内核将向管道上的其他进程发送一个 SIGPIPE 信号。此信号的默认操作(如果未安装处理程序)是终止进程。

如果您不想处理信号,您可以忽略父级中的 SIGPIPE(这样它不会在 tail 终止时终止),而是每次read后检查errno的值是否为EPIPE。此外,您必须从父级调用 waitwaitpid 来获取僵尸子级。

关于c - 如果从管道读取时 tail 失败怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7046693/

相关文章:

c - 多进程和管道

c - 从同一进程发送和接收UDP数据包

sockets - Linux中AF_UNIX数据报消息的最大大小是多少?

java -/tmp 的最佳 Windows 等价物是什么?

python - 带有子进程的 Python 和 C++ 程序之间的通信速度非常慢

c - 在 OSX 上,为什么/usr/bin/cpp 不支持宏参数的字符串化,而 gcc -E 和 clang -E 支持?

c - 如何在C中正确使用fopen命令?

c - 当我尝试使用 struct 运行程序时出现段错误(核心已转储)

mysql - 如何检测命令输出是否正在unix管道中使用

bash - bash 脚本中临时无名管道的问题