【发布时间】:2015-08-22 12:43:49
【问题描述】:
我试图通过我在网上找到的示例程序了解信号在 Linux 中的工作原理,但它有一些我不太了解的部分。
这是我的示例程序:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
void catcher(int sig) {
printf("catcher() has gained control\n");
}
int main(int argc, char *argv[]) {
struct sigaction sigact;
sigset_t sigset;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigact.sa_handler = catcher;
sigaction(SIGUSR1, &sigact, NULL);
printf("before first kill()\n");
kill(getpid(), SIGUSR1);
sigemptyset(&sigset);
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_SETMASK, &sigset, NULL);
printf("before second kill()\n");
kill(getpid(), SIGUSR1);
printf("after second kill()\n");
return 0;
}
这是我的程序的示例输出:
先杀之前()
catcher() 已获得控制权
在第二次杀戮之前()
在第二次杀死()之后
我能知道为什么输出的第一行是before first kill()吗?为什么catcher() has gained control 不先出现?
据我所知,sa_handler 包含两种类型的信号,信号默认和信号忽略。
我们如何知道它将产生哪个信号?如果信号忽略正在生成,为什么会触发打印 catcher() 已获得控制的函数?
此外,这个程序中的sa_mask 函数是什么?据我了解,sa_mask 会屏蔽指定的信号。
【问题讨论】:
-
注意:不要在信号处理程序中使用 printf() 和朋友。它不是信号安全的。