【发布时间】:2021-01-06 15:36:02
【问题描述】:
在大学里,我们目前正在学习守护进程以及如何处理信号。
但是为什么信号处理程序调用信号()?在主方法中 signal(...) 已经被调用。因此,据我了解,当 pkill -SIGUSR1 例如被发送到线程时,主方法中的一个 signal(...)call 应该足以捕获并委托给处理程序。也许有人可以解释一下。
在我们的教科书中有这个例子:
void sighandler (int sig) {
printf ("Caught signal %d\n", sig);
signal (SIGINT, sighandler);
signal (SIGALRM, sighandler);
}
int main (int argc, char *argv [], char *envp []) {
char buffer [1024];
int len;
signal (SIGINT, sighandler);
signal (SIGALRM, sighandler);
alarm (5);
for (len = 0; len < 10; len++)
printf ("Counting %d...\n", len), sleep (1);
alarm (10);
while (1) {
len = read (0, buffer, sizeof (buffer) - 1);
if (len == -1) {
perror ("read () failed");
continue;
}
if (len == 0) {
printf ("Exiting\n");
exit (0);
}
buffer [len] = '\0';
if (!strncmp (buffer, "exit", 4))
exit (0);
write (1, buffer, strlen (buffer));
}
}
【问题讨论】:
-
有点偏离主题,但我可以肯定地告诉你,最好不要在
handlers中使用标准函数,如果你需要输出消息,请使用write()而不是printf。至少您将来知道这一点,并且您不会犯与示例中相同的错误。 -
在我们的教科书中有这个例子: Ooof。一个教科书,它做不安全的事情,比如从信号处理程序调用
printf()?!? -
@real_G 哇,如果你的教授犯了这样的错误,那是有问题的,但无论如何。为您未来的项目记住它。我不确定
handler中的signal,所以让我们看看是否有人准备得更充分。 -
The semantics when using signal to establish a signal handler vary across systems; do not use it for this purpose 无论如何,(在Linux上)它建立了一个一次性处理程序,它必须在触发后重新安装。
-
您可能不应该在过去十年左右编写的任何代码中使用
signal注册信号处理程序,也许是从 90 年代中期开始。使用sigaction。