考虑以下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);
}
}
我们创建一个新流程并区分child(pid = 0)和parent。
可以为每种类型的信号使用自定义处理程序吗?如果是这样,假设我们创建了一个自定义处理程序,如果我只使用一次信号(或从不重置信号处理程序),那么所有信号之间不会有任何差异,因为它只是执行我的处理程序而不考虑函数中的信号?
我想说的是,是不是:
signal(SIGTERM,CustomHandler);
signal(SIGTSTP,CustomHandler);
signal(SIGHUP,CustomHandler);
...
当父运行kill(pid, SomeSignal)
?时,将执行相同的代码
答案 0 :(得分:1)
可以为每种类型的信号使用自定义处理程序吗?
是的,可以注册相同的自定义信号处理函数来处理不同类型的信号,包括可以在相关系统上捕获的所有信号。但请注意,可能存在无法捕获的已定义信号。例如,在符合POSIX的系统上,SIGKILL
和SIGSTOP
具有此属性。
如果是这样, 假设我们创建了一个自定义处理程序,那是不是没有问题 如果我只使用一次信号,那么所有信号之间是否有任何差别 (或从不重置信号处理程序),因为它只会执行我的 处理程序没有考虑函数中的信号?
信号处理函数没有义务在确定要做什么时考虑信号编号。它可以执行相同的操作,无论如何,或者,如在您的示例函数中,它可以简单地将信号编号传递给某个其他函数。您可能会或可能不会认为后者是前者的特例。
请注意,在POSIX系统上,sigaction()
函数优于signal()
用于修改信号处置。它的行为比signal()
在各种操作系统上更灵活,更一致。
答案 1 :(得分:1)
可以为每种类型的信号使用自定义处理程序吗?
是。您可以为可以捕获的所有信号安装自定义"signal-catching" function。 (例如,可能不会捕获SIGKILL和SIGSTOP。)
[我]是正确的,如果我只使用一次信号(或从不重置信号处理程序),所有信号之间不会有任何差别,因为它只会在不考虑信号的情况下执行我的处理程序在功能?
这取决于您如何编码信号捕获功能。系统会将捕获的信号传递给函数,因此相同的函数可以在捕获SIGTERM而不是SIGHUP时执行不同的操作。如果你的处理程序忽略了它的 sig
参数并忽略了信号环境(掩码,堆栈,处置),那么,是的,每次调用都会像其他任何一样。