C语言中的自定义信号处理程序
考虑以下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
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
,但是