什么信号(SIGPIPE,SIG_IGN);做?
Posted
技术标签:
【中文标题】什么信号(SIGPIPE,SIG_IGN);做?【英文标题】:What does signal(SIGPIPE, SIG_IGN); do? 【发布时间】:2015-06-12 09:06:44 【问题描述】:我知道SIGPIPE
和SIGIGN
的各自用途。
是什么
signal(SIGPIPE, SIG_IGN);
确实如此?
【问题讨论】:
Program received signal SIGPIPE, Broken pipe.?的可能重复 【参考方案1】:signal(SIGPIPE, SIG_IGN);
简单地忽略信号SIGPIPE
。将SIG_IGN
作为handler 传递会忽略给定的信号(信号SIGKILL
和SIGSTOP
除外,它们不能被捕获或忽略)。
顺便说一句,通常建议使用sigaction(2)
而不是signal(2)
,因为sigaction
提供更好的控制,并且在某些系统上也不需要“重置”处理程序(遵循 System V 信号行为) .
【讨论】:
如果之前已经设置过这个处理程序,我们也可以取消设置它吗? 你可以再次调用signal(2)来重置它。例如,要将其重置为默认行为,请调用:signal(SIGPIPE, SIG_DFL);
。
signal()
还返回之前安装的处理程序。所以一个干净的重置应该是:void (*old)(int); old = signal(some_signal,some_handler); ... signal(some_signal,old);
。无论如何,signal
是旧的(被认为是过时的)接口,你应该使用sigaction
是地方。
如何在忽略 SIGPIPE 信号后立即在代码中执行某些操作,例如 ` printf("SIGPIPE signal detected!") `
不确定我是否理解“忽略给定的信号忽略它”以上是关于什么信号(SIGPIPE,SIG_IGN);做?的主要内容,如果未能解决你的问题,请参考以下文章
调用了signal(SIGPIPE, SIG_IGN)仍然出现Program received signal SIGPIPE, Broken pipe.
调用了signal(SIGPIPE, SIG_IGN)仍然出现Program received signal SIGPIPE, Broken pipe.