【问题标题】:Sending SIGSTOP to a child process stops all execution. C向子进程发送 SIGSTOP 会停止所有执行。 C
【发布时间】:2011-04-20 13:22:22
【问题描述】:

当我从父级调用kill(Child_PID, SIGSTOP); 时,我希望子级停止执行而父级继续。这是预期的行为还是我必须在孩子中明确声明 SIGSTOP 处理程序?我到处搜索,但无法找到此信息。

谢谢。 布雷登

【问题讨论】:

  • 我遇到过这种问题。尝试运行ps 看看它是否真的停止了(应该)。我怀疑您应该在 waitpid() 中添加 WUNTRACED 以检测主进程中停止的子进程。

标签: c unix process parent-child signals


【解决方案1】:

这是预期的行为。

使用strace your_program 看看发生了什么。

【讨论】:

    【解决方案2】:

    POSIX 说:

    系统不允许进程捕获信号 SIGKILL 和 SIGSTOP。

    因此,如果信号发送成功,孩子别无选择,只能停下来。而且您不能在子(或父或任何其他)进程中设置 SIGSTOP 处理程序。

    【讨论】:

    • 好的,我已经在我的程序上运行了 strace 并观察了孩子们,一旦调用 kill ,所有的执行都会停止,它不会退出,只是停止。
    • @Braden:那是因为您使用了SIGSTOP 而不是SIGKILL 或任何其他信号。这是预期的行为。
    • @Braden:你还期待什么? SIGSTOP 表示“停止执行;进入暂停状态,直至另行通知”,其中“进一步通知”是 SIGCONT 信号(或可能是 SIGKILL 信号)。
    • 我的意思是在信号发送给孩子之后,即使是父母也停止执行。
    • @Braden:Child_PID 是否有可能是 0 由于某种原因(因为这会将信号发送到当前进程组中的所有进程)或否定?
    【解决方案3】:

    这是预期的行为。引用 unix 手册页:

    信号 SIGKILL 和 SIGSTOP 不能被捕获、阻止或忽略。

    BSD 手册页提到:

    signal() 函数将失败并且不会发生任何操作 如果出现以下情况之一:

    [EINVAL]           The sig argument is not a valid signal number.
    [EINVAL]           An attempt is made to ignore or supply a handler
                       for SIGKILL or SIGSTOP.
    

    最后,您不能为 SIGSTOP 安装处理程序。并且进程会一直保持挂起状态,直到收到SIGCONT

    【讨论】:

      最近更新 更多