我为一个进程写了一个信号处理程序,之后fork(),信号处理程序将被应用于父进程和subprocess。 如果我用“exec”replacesubprocess,那么信号处理程序就不在了。
我知道这是因为“exec”调用会覆盖subprocess地址空间。 我只是想知道是否有办法让信号处理程序在“exec”调用之后工作?
不。从man
页:
execve()不会成功返回,调用进程的文本,数据,bss和堆栈将被加载的程序覆盖。 被调用的程序继承了调用进程的PID,以及任何未被设置为在exec上关闭的打开的文件描述符。 呼叫过程中挂起的信号被清除。 设置为被调用进程捕获的任何信号都会重置为默认行为。 SIGCHLD信号(当设置为SIG_IGN时)可以或不可以被重置为SIG_DFL。
事实上,如果信号处理程序在代码被一些非常不同的代码替换之后仍然是活动的,那么当信号发生时,可能会有各种各样的混乱。 毕竟,信号处理器只是一个地址,当发生什么事情(现在折扣SIG_IGN
和SIG_DFL
)。 当您替换整个文本段时,谁知道该地址的代码是什么?