- 论坛徽章:
- 0
|
本帖最后由 edwardhey 于 2010-12-19 14:23 编辑
冏... 非常不好意思 给大家带来麻烦... 原来是mac os的信号和linux的不一样~ 一样的程序在ubuntu上面和期望的一样输出,但是在mac os上面就有问题了... 感谢@jerryz920,@itw1得回答~ 谢谢~
我对struct sigaction 的sa_mask有点疑惑, 我的代码:- #include "apue.h"
- static void sigparse1(int sig,siginfo_t * param,void * p2){
- pr_mask("in sigparse1: ");
- //raise(SIGUSR2);
- sleep(5);
- printf("end sigparse1\n");
- }
- static void sigparse2(int sig,siginfo_t * param,void *p2){
- pr_mask("in sigparse2: ");
- //raise(SIGUSR1);
- sleep(5);
- printf("end sigparse2\n");
- }
- int main (int argc, const char * argv[]) {
- struct sigaction act;
- act.sa_sigaction=sigparse1;
- act.sa_flags = 0;
- sigemptyset(&act.sa_mask);
- sigaddset(&act.sa_mask, SIGUSR2);
- sigaction(SIGUSR1, &act, NULL);
-
-
- act.sa_sigaction = sigparse2;
- act.sa_flags = 0;
- sigemptyset(&act.sa_mask);
- //sigaddset(&act.sa_mask,SIGUSR1);
- sigaction(SIGUSR2, &act, NULL);
-
- printf("start working ,send signal cmd:\nkill -s USR1 %d\n",getpid());
- //raise(SIGUSR1);
- //sleep(1);
- //raise(SIGUSR2);
- pause();
- sleep(25);
- return 0;
- }
复制代码 APUE上说是在处理过程中屏蔽对sa_mask的信号,比如上面在处理SIGUSR1的时候 添加了对SIGUSR2的屏蔽
我的疑惑是:
1,是不是说在sigparse1函数内,如果有SIGUSR2的信号出现就会被堵塞呢,比如在sigparse1内会有raise(SIGUSR2)这类的调用,就堵塞了?
2,编译运行后 另外起一个终端,
kill -s USR2 842
kill -s USR1 842
输出:
start working ,send signal cmd:
kill -s USR1 842
in sigparse2: SIGUSR2
in sigparse1: SIGUSR1 SIGUSR2
end sigparse1
end sigparse2
而如果这样:
kill -s USR1 854
kill -s USR2 854
输出:
start working ,send signal cmd:
kill -s USR1 854
in sigparse1: SIGUSR1 SIGUSR2
end sigparse1 //理应该等待5秒后才打印end sigparse1的 , 可是为什么我发送kill -s USR2 854的时候 就马上输出这句,然后进入sigparse2函数了 呢?
in sigparse2: SIGUSR2
end sigparse2
,这里我不太懂是,似乎SIGUSR2打断了SIGUSR1的信号处理,然后不是在SIGUSR1中添加了对SIGUSR2的sa_mask屏蔽字么?为什么还会被SIGUSR2信号打断呢...不懂中,希望各位帮帮忙哈~谢谢~ |
|