【问题标题】:Custom Signal Handler in CC 中的自定义信号处理程序
【发布时间】:2017-11-30 22:36:27
【问题描述】:

考虑以下 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)时会执行相同的代码?

【问题讨论】:

  • 这个信号用于什么内核? Linux? BSD?操作系统? TI83OS?
  • 是Linux的,忘记指定了
  • 重要提示:阅读signal-safety(7) & signal(7)

标签: c linux process signals kill


【解决方案1】:

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

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

如果是这样, 假设我们创建了一个自定义处理程序,是否正确 如果我只使用一次信号,那么所有信号之间的差异 (或者永远不要重置信号处理程序),因为它只会执行我的 处理程序而不考虑函数中的信号?

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

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

【讨论】:

  • 感谢您的精彩回答。因此,如果我在子进程中有signal(SIGKILL,CustomHandler)kill(pid, SIGKILL),我可以肯定地说孩子不会赶上 SIGKILL,只会被杀死,对吧? (SIGSTOP 也是如此??)
  • @Ergo,无论它或它的父母做什么,孩子都不会抓住或忽略SIGKILL。如果那个信号被传递给它,那么它就会死掉。如果它尝试为SIGKILL 注册处理程序,那么我预计该尝试会失败,返回SIG_ERR,但即使它没有,POSIX 仍然指定SIGKILL 不能被捕获(或忽略)。
  • SIGKILL 抓不住,孩子会被杀。 SIGSTOP 不能被抓到,但是孩子会被阻止——这和被杀是不一样的。阅读 POSIX signal concepts 和链接的项目。
【解决方案2】:

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

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

[我]如果我只使用一次信号(或从不重置信号处理程序),那么所有信号之间没有任何区别是正确的,因为它只会执行我的处理程序而不考虑信号在函数中?

这取决于您如何编写信号捕获函数。系统会将捕捉到的信号传递给函数,因此相同的函数可以在捕捉到 SIGTERM 而不是 SIGHUP 时做一些不同的事情,例如。如果您的处理程序忽略了它的 sig 参数并且通常忽略了信号环境(掩码、堆栈、处置),那么,是的,每个调用都会像其他任何调用一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-05
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多