C中的自定义信号处理程序

时间:2017-06-27 18:43:15

标签: c linux process signals kill

考虑以下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)

时,

将执行相同的代码

2 个答案:

答案 0 :(得分:1)

  

可以为每种类型的信号使用自定义处理程序吗?

是的,可以注册相同的自定义信号处理函数来处理不同类型的信号,包括可以在相关系统上捕获的所有信号。但请注意,可能存在无法捕获的已定义信号。例如,在符合POSIX的系统上,SIGKILLSIGSTOP具有此属性。

  

如果是这样,   假设我们创建了一个自定义处理程序,那是不是没有问题   如果我只使用一次信号,那么所有信号之间是否有任何差别   (或从不重置信号处理程序),因为它只会执行我的   处理程序没有考虑函数中的信号?

信号处理函数没有义务在确定要做什么时考虑信号编号。它可以执行相同的操作,无论如何,或者,如在您的示例函数中,它可以简单地将信号编号传递给某个其他函数。您可能会或可能不会认为后者是前者的特例。

请注意,在POSIX系统上,sigaction()函数优于signal()用于修改信号处置。它的行为比signal()在各种操作系统上更灵活,更一致。

答案 1 :(得分:1)

  

可以为每种类型的信号使用自定义处理程序吗?

是。您可以为可以捕获的所有信号安装自定义"signal-catching" function。 (例如,可能不会捕获SIGKILL和SIGSTOP。)

  

[我]是正确的,如果我只使用一次信号(或从不重置信号处理程序),所有信号之间不会有任何差别,因为它只会在不考虑信号的情况下执行我的处理程序在功能?

这取决于您如何编码信号捕获功能。系统会将捕获的信号传递给函数,因此相同的函数可以在捕获SIGTERM而不是SIGHUP时执行不同的操作。如果你的处理程序忽略了它的 sig 参数并忽略了信号环境(掩码,堆栈,处置),那么,是的,每次调用都会像其他任何一样。