为什么在Child Process中忽略了SIGABRT信号

时间:2011-08-23 14:57:40

标签: linux unix

我们有一个Linux服务进程,它使用fork生成子进程,然后运行execelp来执行另一个程序。当我们运行命令“kill -6 [child_pid]”时它没有任何效果。如果子程序是自行运行的,那么相同的命令将终止子程序,所以我们非常确定在这种情况下系统正在处理信号。那么,为什么在服务流程的控制下,子流程没有被它接收呢?任何帮助将不胜感激。

这种情况发生在RedHat Linux和CentOS上。

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

另外我想提一下,同一个命令对父进程有效,所以我们知道父进程不处理(忽略)SIGABRT。父级由shell脚本(bash)运行。所以在运行命令“ps”中,我看到shell脚本pid,父pid和子pid。该命令适用于父pid和shell脚本pid。

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

2 个答案:

答案 0 :(得分:1)

引自man sigaction

  

通过fork(2)创建的子级继承其父级信号的副本          位置。在execve(2)期间,处理信号的处置          被重置为默认值;留下被忽略信号的处置          不变。

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

答案 1 :(得分:0)

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

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