C 中的自定义信号处理程序
Custom Signal Handler in C
考虑以下 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 的系统上,SIGKILL
和 SIGSTOP
具有此 属性.
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()
更灵活、更一致。
Can a custom handler be used for every type of signals?
是的。您可以为所有可以捕获的信号安装自定义 "signal-catching" function。 (例如,SIGKILL 和 SIGSTOP 可能不会被捕获。)
[I]s 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?
这取决于您如何编写信号捕获函数的代码。系统会将捕捉到的信号传递给函数,因此同一个函数可以在捕捉到 SIGTERM 而不是 SIGHUP 时做一些不同的事情,例如。如果您的处理程序忽略其 sig
参数并通常忽略信号环境(掩码、堆栈、处置),那么,是的,每次调用都会像其他任何调用一样。
考虑以下 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 的系统上,SIGKILL
和 SIGSTOP
具有此 属性.
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()
更灵活、更一致。
Can a custom handler be used for every type of signals?
是的。您可以为所有可以捕获的信号安装自定义 "signal-catching" function。 (例如,SIGKILL 和 SIGSTOP 可能不会被捕获。)
[I]s 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?
这取决于您如何编写信号捕获函数的代码。系统会将捕捉到的信号传递给函数,因此同一个函数可以在捕捉到 SIGTERM 而不是 SIGHUP 时做一些不同的事情,例如。如果您的处理程序忽略其 sig
参数并通常忽略信号环境(掩码、堆栈、处置),那么,是的,每次调用都会像其他任何调用一样。