gpt4 book ai didi

linux - 破管不再结束程序?

转载 作者:IT王子 更新时间:2023-10-29 01:11:04 24 4
gpt4 key购买 nike

当您通过管道传输两个进程并在管道的“输出”处终止一个进程时,第一个进程用于接收“Broken Pipe”信号,通常也会终止它。例如。运行

$> do_something_intensive | less

然后退出 less 在 SuSE8 或更早的版本上用于立即返回到响应式 shell。当我今天尝试这样做时,do_something_intensive 显然仍在运行,直到我手动将其终止。似乎有些东西发生了变化(glib?shell?)使程序忽略“破损的管道”......

你们中有人对此有提示吗?如何恢复以前的行为?为什么它被改变了(或者为什么它总是存在多种语义)?

编辑:进一步的测试(使用 strace)显示生成了“SIGPIPE”,但程序没有中断。一个简单的

#include <stdio.h>
int main()
{
while(1) printf("dumb test\n");
exit(0);
}

会继续下去

--- SIGPIPE (Broken pipe) @ 0 (0) ---
write(1, "dumb test\ndumb test\ndumb test\ndu"..., 1024) = -1 EPIPE (Broken pipe)

less 被杀死时。我可以肯定地在我的程序中编写一个信号处理程序并确保它终止,但我更多的是寻找一些环境变量或一个 shell 选项来强制程序在 SIGPIPE 上终止

再次编辑:这似乎是一个特定于 tcsh 的问题(bash 正确处理它)并且依赖于终端(Eterm 0.9.4)

最佳答案

好吧,如果在读取器离开后尝试写入管道,则会生成 SIGPIPE 信号。应用程序有能力捕捉到这个信号,但如果没有,进程就会被终止。

SIGPIPE 在调用进程尝试写入之前不会生成,因此如果没有更多输出,则不会生成。

关于linux - 破管不再结束程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/103016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com