我为进程写了一个信号处理程序,然后fork(),信号处理程序将应用于父进程和子进程。如果我用“exec”替换子进程,则不再有信号处理程序。
我知道发生这种情况是因为“exec”调用会用它自己覆盖子进程地址空间。 我只是想知道即使在“exec”调用之后是否有办法使信号处理程序工作?
答案 0 :(得分:34)
没有。来自man
页:
execve()在成功时不返回,并且调用进程的text,data,bss和stack将被加载的程序覆盖。调用的程序继承了调用进程的PID,以及未设置为在exec上关闭的任何打开的文件描述符。将清除呼叫进程中待处理的信号。设置为由调用进程捕获的任何信号都将重置为其默认行为。 SIGCHLD信号(设置为SIG_IGN时)可能会也可能不会重置为SIG_DFL。
事实上,如果在用一些非常不同的代码替换代码之后信号处理程序仍处于活动状态,那么当信号发生时你可能会遇到各种各样的混乱。毕竟,信号处理程序只是发生事件时要调用的地址(现在打折SIG_IGN
和SIG_DFL
)。当您替换整个文本段时,谁知道该地址的代码是什么?