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

C语言中的自定义信号处理程序,c,linux,process,signals,kill,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

考虑以下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)
时,是否将执行相同的代码

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

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

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

信号处理函数在确定要做什么时不必考虑信号号。无论发生什么,它都可以执行相同的操作,或者,就像在示例函数中一样,它可以简单地将信号号传递给其他函数。你可以或者不认为后者是前者的特例。 但是,请注意,在POSIX系统上,修改信号配置时,

sigaction()
函数优于
signal()
。在各种操作系统上,它的行为比
signal()
更灵活、更一致

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

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

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

信号处理函数在确定要做什么时不必考虑信号号。无论发生什么,它都可以执行相同的操作,或者,就像在示例函数中一样,它可以简单地将信号号传递给其他函数。你可以或者不认为后者是前者的特例。 但是,请注意,在POSIX系统上,修改信号配置时,

sigaction()
函数优于
signal()
。在各种操作系统上,它的行为比
signal()
更灵活、更一致

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

对。您可以为可以捕获的所有信号安装自定义。(例如,可能无法捕获SIGKILL和SIGSTOP。)

[一] 如果我只使用一次信号(或者从不重置信号处理程序),那么所有信号之间不会有任何差异,因为它只执行我的处理程序,而不考虑函数中的信号,这是对的吗

这取决于您如何编写信号捕获函数。系统将捕获的信号传递给函数,因此同一函数在捕获SIGTERM而不是SIGHUP时可以执行不同的操作。如果处理程序忽略其
sig
参数,并且通常忽略信号环境(掩码、堆栈、处理),那么,是的,每个调用都与其他调用一样

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

对。您可以为可以捕获的所有信号安装自定义。(例如,可能无法捕获SIGKILL和SIGSTOP。)

[一] 如果我只使用一次信号(或者从不重置信号处理程序),那么所有信号之间不会有任何差异,因为它只执行我的处理程序,而不考虑函数中的信号,这是对的吗


这取决于您如何编写信号捕获函数。系统将捕获的信号传递给函数,因此同一函数在捕获SIGTERM而不是SIGHUP时可以执行不同的操作。如果处理程序忽略其
sig
参数,并且通常忽略信号环境(掩码、堆栈、处理),那么,是的,每个调用都与其他调用一样。

此信号用于什么内核?Linux?BSD?磁盘操作系统TI83OS?它是针对Linux的,忘了指定重要的:读取&这个信号是用于什么内核的?Linux?BSD?磁盘操作系统TI83OS?它是针对Linux的,忘了指定重要内容:阅读并感谢您的回答。因此,如果我在子进程中有
signal(SIGKILL,CustomHandler)
kill(pid,SIGKILL)
我可以肯定地说,子进程不会捕获SIGKILL,只会被杀死,对吗?(SIGSTOP也是如此???)因此,可以肯定的是,孩子不会捕捉或忽略
SIGKILL
,无论他或他的父母做什么。如果这个信号被传递给它,那么它就会死亡。如果它试图为
SIGKILL
注册一个处理程序,那么我预计该尝试会失败,返回
SIG_ERR
,但即使没有注册,POSIX仍然指定不能捕获(或忽略)
SIGKILL
。不能捕获
SIGKILL
,并且将杀死子对象。无法捕获
SIGSTOP
,但是