【问题标题】:Why is signal SIGABRT ignored in Child Process为什么子进程中忽略信号 SIGABRT
【发布时间】:2011-08-23 14:57:39
【问题描述】:

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

这正在 RedHat Linux 和 CentOS 中发生。

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

另外我想提一下,同样的命令也适用于父进程,所以我们知道父进程不处理(忽略)SIGABRT。父进程由 shell 脚本 (bash) 运行。因此,在运行命令“ps”时,我看到了 shell 脚本 pid、父 pid 和子 pid。该命令适用于父 pid 和 shell 脚本 pid。

我的理解是即使子进程继承信号处理程序,在 execlp 之后子程序不会。

【问题讨论】:

  • 你的理解不正确...函数的exec family会导致child继承被忽略和阻塞的信号。这里没有魔法;要么内核有问题(不太可能),要么孩子阻塞或忽略SIGABRT。没有其他可能。

标签: linux unix


【解决方案1】:

引用man sigaction:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 正如我编辑的问题所提到的,父进程实际上并没有忽略或阻止 SIGABRT,因此继承在这里应该无关紧要。但是问题仍然存在,为什么子程序没有接收到信号?
    猜你喜欢
    • 2012-10-08
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多