【问题标题】:Is it possible to signal handler to survive after "exec"?是否可以在“exec”之后发出信号处理程序生存?
【发布时间】:2010-02-25 11:36:38
【问题描述】:

我为一个进程编写了一个信号处理程序,然后 fork() ,信号处理程序将应用于父进程和子进程。如果我用“exec”替换子进程,信号处理程序就没有了。

我知道这是因为“exec”调用会用它自己的覆盖子进程地址空间。 我只是想知道即使在“exec”调用之后是否有办法让信号处理程序工作?

【问题讨论】:

    标签: linux exec signals


    【解决方案1】:

    没有。来自man 页面:

    execve() 成功时不返回,调用进程的文本、数据、bss 和堆栈被加载的程序覆盖。被调用的程序继承调用进程的 PID,以及任何未设置为在 exec 上关闭的打开文件描述符。调用进程上未决的信号被清除。任何设置为被调用进程捕获的信号都将重置为其默认行为。 SIGCHLD 信号(当设置为 SIG_IGN 时)可能会或可能不会重置为 SIG_DFL。

    事实上,如果在代码被一些非常不同的代码替换后信号处理程序仍然处于活动状态,那么当信号发生时,您可能会遇到各种混乱。毕竟,信号处理程序只是在发生某些事情时调用的地址(暂时不考虑SIG_IGNSIG_DFL)。谁知道当您替换整​​个文本段时,该地址会出现什么代码?

    【讨论】:

    • 很好地解释了,thanx Pax。实际上我已经浏览了手册页,只是想知道它是否可以通过一些环境变量或其他东西传递。
    • @Matt for SIG_IGN 孩子会忽略这个信号。 SIG_DFL 没有意义,因为它已经具有默认行为。
    • 但是请注意,进程信号掩码在执行过程中确实存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多