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

标签 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);
  }
}

我们创建一个新进程并区分子进程(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 的系统上,SIGKILLSIGSTOP 具有此属性。

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/

相关文章:

mysql - 无法连接到 'localhost' (111) 上的 MySQL 服务器

linux - 连接多个启动板存储库

c# - 如何区分具有相同名称的进程

design-patterns - 也不要在软件中产生未知的途径吗? [丰田原则]

linux - Knife 工问题

synchronization - 如何同步两个进程?

c - 什么时候在全局变量前使用 static 关键字?

c - 同时生成真正的随机整数?

c - 指向 C 中内置函数的函数指针

linux - 在 GNU tar 中, 'y' 操作数有什么作用?