信号处理程序是否有可能在"exec"之后存活?

adi*_*tya 29 linux signals exec

我为进程写了一个信号处理程序,然后fork(),信号处理程序将应用于父进程和子进程.如果我用"exec"替换子进程,则信号处理程序不再存在.

我知道发生这种情况是因为"exec"调用将使用它自己覆盖子进程地址空间.我只是想知道即使在"exec"调用之后是否有办法让信号处理程序工作?

pax*_*blo 36

不.从man页面:

execve()在成功时不返回,并且调用进程的text,data,bss和stack被加载的程序覆盖.调用的程序继承了调用进程的PID,以及未设置为在exec上关闭的任何打开的文件描述符.将清除呼叫进程中待处理的信号.设置为由调用进程捕获的任何信号都将重置为其默认行为.SIGCHLD信号(设置为SIG_IGN时)可能会也可能不会重置为SIG_DFL.

实际上,如果在代码被一些非常不同的代码替换之后信号处理程序仍然处于活动状态,那么当信号发生时你可能会遇到各种各样的混乱.信号处理程序,毕竟只是一个地址打电话有事时(贴现SIG_IGNSIG_DFL现在).当您替换整​​个文本段时,谁知道该地址的代码是什么?

  • 但是请注意,进程信号掩码在 exec 后仍然存在。 (3认同)