当您管道两个进程并在管道的“输出”处终止一个进程时,第一个进程用于接收“Broken Pipe”信号,这通常也会终止它。例如跑步
$> do_something_intensive | less
然后在 SuSE8 或更早版本上退出less used 以立即将您返回到响应式 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)
当更少被杀死时。我可以肯定地在我的程序中编写一个信号处理程序并确保它终止,但我更多的是寻找一些环境变量或 shell 选项来强制程序在 SIGPIPE 上终止
再次编辑:这似乎是一个特定于 tcsh 的问题(bash 正确处理它)并且依赖于终端(Eterm 0.9.4)