【发布时间】:2010-02-25 11:36:38
【问题描述】:
我为一个进程编写了一个信号处理程序,然后 fork() ,信号处理程序将应用于父进程和子进程。如果我用“exec”替换子进程,信号处理程序就没有了。
我知道这是因为“exec”调用会用它自己的覆盖子进程地址空间。 我只是想知道即使在“exec”调用之后是否有办法让信号处理程序工作?
【问题讨论】:
我为一个进程编写了一个信号处理程序,然后 fork() ,信号处理程序将应用于父进程和子进程。如果我用“exec”替换子进程,信号处理程序就没有了。
我知道这是因为“exec”调用会用它自己的覆盖子进程地址空间。 我只是想知道即使在“exec”调用之后是否有办法让信号处理程序工作?
【问题讨论】:
没有。来自man 页面:
execve() 成功时不返回,调用进程的文本、数据、bss 和堆栈被加载的程序覆盖。被调用的程序继承调用进程的 PID,以及任何未设置为在 exec 上关闭的打开文件描述符。调用进程上未决的信号被清除。任何设置为被调用进程捕获的信号都将重置为其默认行为。 SIGCHLD 信号(当设置为 SIG_IGN 时)可能会或可能不会重置为 SIG_DFL。
事实上,如果在代码被一些非常不同的代码替换后信号处理程序仍然处于活动状态,那么当信号发生时,您可能会遇到各种混乱。毕竟,信号处理程序只是在发生某些事情时调用的地址(暂时不考虑SIG_IGN 和SIG_DFL)。谁知道当您替换整个文本段时,该地址会出现什么代码?
【讨论】: