什么信号(SIGPIPE,SIG_IGN);做?

Posted

技术标签:

【中文标题】什么信号(SIGPIPE,SIG_IGN);做?【英文标题】:What does signal(SIGPIPE, SIG_IGN); do? 【发布时间】:2015-06-12 09:06:44 【问题描述】:

我知道SIGPIPESIGIGN 的各自用途。

是什么

signal(SIGPIPE, SIG_IGN);

确实如此?

【问题讨论】:

Program received signal SIGPIPE, Broken pipe.?的可能重复 【参考方案1】:
signal(SIGPIPE, SIG_IGN);

简单地忽略信号SIGPIPE。将SIG_IGN 作为handler 传递会忽略给定的信号(信号SIGKILLSIGSTOP 除外,它们不能被捕获或忽略)。

顺便说一句,通常建议使用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.

CentOS 上的“信号”功能:意外行为

redis 同步

C: signal() 是进程级别的吗?

linux网络编程中需要注意的信号SIGPIPE