为什么在子进程中忽略SIGABRT信号

问题描述:

我们有一个Linux服务进程,它使用fork生成一个子进程,然后运行execelp来执行另一个程序。当我们运行一个命令“kill -6 [child_pid]”时,它不起作用。如果它是由它自己运行的,那么同样的命令会杀死子程序,所以我们确信在这种情况下信号正在被系统处理。那么,为什么当它处于te服务流程的控制之下时,它不会被子进程接收到呢?任何帮助将不胜感激。为什么在子进程中忽略SIGABRT信号

而这正在RedHat Linux和CentOS中发生。

核心文件大小设置为无限制。

另外我想提一下,相同的命令在父进程上工作,所以我们知道父母不处理(忽略)SIGABRT。父母由一个shell脚本(bash)运行。所以在运行命令“ps”时,我看到了shell脚本pid,父pid和子pid。该命令对父pid和shell脚本pid起作用。

而我的理解是即使子进程继承信号处理程序,execlp之后的子程序没有。

+0

你的理解不正确......函数的[exec family](http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html)将导致孩子继承忽略和阻止的信号。这里没有魔法;内核有问题(非常不可能),或者孩子阻止或忽略'SIGABRT'。没有其他可能性。 – Nemo

子进程在fork时间从父级继承其信号掩码。

所以我会推测你的父进程阻止SIGABRT(通过sigprocmask or pthread_sigmask)。

+0

正如我编辑的问题所提到的,父进程实际上不会忽略或阻止SIGABRT,所以继承在这里应该不重要。但问题仍然存在,为什么信号没有被儿童节目收到? – Quinn

man sigaction举例:

经由叉(2)创建一个子继承父的信号的副本解散 位置。在execve(2)期间,处理信号 的配置被重置为默认值;被忽略的信号的配置保持不变。

所以我的猜测是服务进程设置为忽略SIGABRT,这是由孩子继承。