调用exec()后进程已设置的信号处理程序会发生什么变化?
exec类系统调用对信号处理程序的影响
执行exec()类系统调用成功加载新程序后,原进程设置的信号处理配置不会全部保留,具体规则如下:
- 所有绑定了自定义捕获处理函数的信号,处理逻辑会被统一重置为系统默认行为(
SIG_DFL)。
这是因为exec调用会完全替换当前进程的地址空间,把旧程序的代码段、数据段全部清掉,换成新可执行文件的内容。你之前注册的信号处理函数是旧程序里的代码,新程序的内存里根本找不到这个函数的地址,不具备执行条件,自然不可能保留。 - 原先被设置为
SIG_IGN(忽略信号)的配置,默认会在exec后保留。
这里存在实现差异:针对SIGCHLD信号的忽略配置,POSIX标准没有做强制要求,不同操作系统的处理逻辑可能不一样,Linux环境下会保留忽略配置。 SIGKILL、SIGSTOP这两个信号本身就不允许自定义处理、不允许被忽略,exec前后始终走系统默认逻辑,不存在重置或者保留的问题。
和你提到的fork()场景逻辑不同:fork只是创建子进程并复制父进程的地址空间,信号处理函数的地址在子进程里依然有效,所以子进程会完整继承父进程的信号处理配置,这和exec替换整个程序映像的逻辑有本质区别。
内容的提问来源于stack exchange,提问作者Rowooz
相关产品推荐
相关产品推荐

