考虑以下 C 代码块:
void TERMHandler(int sig){
signal (sig, SIG_DFL);
}
main() {
pid_t pid;
pid = fork()
if (pid == 0) {
signal(SIGTERM,TERMHandler);
while(1);
}
else
{
sleep(3);
kill(pid,SIGTERM);
sleep(3);
kill(pid,SIGTERM);
}
}
我们创建一个新进程并区分子进程(pid = 0)和父进程。
自定义处理程序可以用于每种类型的信号吗?如果是这样,假设我们创建了一个自定义处理程序,如果我只使用一次信号(或从不重置信号处理程序),那么所有信号之间不会有任何区别是否正确,因为它只会执行我的处理程序而不考虑函数中的信号?
我想说的是,这样对吗:
signal(SIGTERM,CustomHandler);
signal(SIGTSTP,CustomHandler);
signal(SIGHUP,CustomHandler);
...
当父级运行 kill(pid, SomeSignal)
时会执行相同的代码吗?
最佳答案
Can a custom handler be used for every type of signals?
是的,可以注册相同的自定义信号处理函数来处理不同类型的信号,直至并包括可以在相关系统上捕获的所有信号。但是请注意,可能存在无法捕获的已定义信号。例如,在符合 POSIX 的系统上,SIGKILL
和 SIGSTOP
具有此属性。
If so, assuming we create a custom handler, is it right that there wouldn't be any difference between all signals if I only use the signal once (or never reset the signal handler), since it would just execute my handler without considering the signal in the function?
信号处理函数在确定要做什么时没有义务考虑信号编号。无论如何,它都可以执行相同的操作,或者,就像在您的示例函数中一样,它可以简单地将信号编号传递给其他函数。您可能会或可能不会认为后者是前者的特例。
但是请注意,在 POSIX 系统上,sigaction()
函数比 signal()
函数更适合修改信号配置。在各种操作系统上,它的行为比 signal()
更灵活、更一致。
关于C 中的自定义信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44787643/