【发布时间】:2012-07-13 06:19:24
【问题描述】:
我正在阅读有关sigaction() 的一些信息(来源来自我的课程笔记),但我不确定我是否理解这段文字:
信号掩码仅在以下期间计算和安装 信号处理程序。
默认情况下,信号“sig”出现时也会被屏蔽。
一旦使用 sigaction 为特定信号安装了操作, 在明确请求另一个操作之前,它会一直保持安装状态。
这是否意味着从信号处理程序返回后恢复默认信号掩码?
另外,使用后是否必须重新安装处理程序,就像我使用signal()一样?
另外,还有这段代码:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void termination_handler(int signum) {
exit(7);
}
int main (void) {
struct sigaction new_action,old_action;
new_action.sa_handler = termination_handler;
sigemptyset(&new_action.sa_mask);
sigaddset(&new_action.sa_mask, SIGTERM);
new_action.sa_flags = 0;
sigaction(SIGINT, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN) {
sigaction(SIGINT,&new_action,NULL);
}
sleep(10);
return 0;
}
那么 - SIGTERM 究竟将如何处理?我可以看到安装的处理程序是termination handler(),但随后SIGTERM 被添加到信号掩码中而没有使用sigprocmask()。这是什么意思?谢谢!
附:最后一个问题:为什么main() 中有if 语句?
【问题讨论】:
-
你用过自己的信号处理器吗?如果没有,我的建议是首先使用您自己的信号处理程序。那么,sigaction 就很容易理解了。 İf 语句用于比较(检查捕获的信号应为一个)。而且,第一个问题的答案在于“信号处理程序的持续时间”。
标签: c unix signals bitmask systems-programming