当您管道两个进程并在管道的“输出”处终止该进程时,第一个进程用于接收“broken Pipe”信号,该信号通常也会终止它.例如.赛跑
$> do_something_intensive | less
然后退出较少用于立即返回到SuSE8或以前版本的响应shell.
当我今天尝试时,do_something_intensive显然仍在运行,直到我手动杀死它.似乎某些事情发生了变化(glib?shell?),这使得程序忽略了“破碎的管道”……
你们中的任何人都有这方面的暗示吗?如何恢复以前的行为?为什么它已被改变(或为什么它总是存在多个语义)?
编辑:进一步测试(使用strace)显示生成了“SIGPIPE”,但程序没有中断.一个简单的
#include dio.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)
最佳答案
好吧,如果在读取器消失后尝试写入管道,则会生成SIGPIPE信号.应用程序能够捕获此信号,但如果没有,则该进程被终止.
原文地址:https://www.jb51.cc/linux/440083.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。