0

来自man sigprocmask

“如果 oset 不为空,则将其设置为信号掩码的先前值。”

我的问题:没有运行或调试程序,

  1. 执行第 10 行后,旧信号掩码的值存储到y. 由于在执行此行之前没有阻塞信号,所以 的值是y多少?

  2. 有没有办法确定z执行第 14 行后的值?

1 void my_sig_handler(int sig){
2     write(1, "a", 1);
3 }
4 int main(){
5     signal(SIGINT, my_sig_handler);
6     sigset_t x, y, z;
7     sigemptyset(&x);
8     sigaddset(&x, SIGINT);
9
10    sigprocmask(SIG_BLOCK, &x, &y);
11    write(1,"1",1);
12    do_some_work();
13    write(1,"2",1);
14    sigprocmask(SIG_SETMASK, &y, &z);
15
16    exit(0);
17 }
4

1 回答 1

0

您可以使用 来测试信号集中的成员资格sigismember。从历史上看,POSIX 省略了一种方法来识别可能是您需要测试的信号编号的值范围,但所有历史系统都已_NSIG或已NSIG定义来告诉您这一点,未来的 POSIX 正在添加它。

请注意,您通常不能假设y第 10 行之后为空,因为信号掩码是跨fork/继承的exec。您的程序可能已在某些信号被屏蔽的情况下启动。

于 2019-11-24T02:28:06.220 回答