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