Chinaunix

标题: [已解决]对信号函数sigaction的sa_mask的疑惑,求解疑 [打印本页]

作者: edwardhey    时间: 2010-12-19 09:16
标题: [已解决]对信号函数sigaction的sa_mask的疑惑,求解疑
本帖最后由 edwardhey 于 2010-12-19 14:23 编辑

冏... 非常不好意思 给大家带来麻烦... 原来是mac os的信号和linux的不一样~ 一样的程序在ubuntu上面和期望的一样输出,但是在mac os上面就有问题了... 感谢@jerryz920,@itw1得回答~ 谢谢~

我对struct sigaction 的sa_mask有点疑惑, 我的代码:
  1. #include "apue.h"
  2. static void sigparse1(int sig,siginfo_t * param,void * p2){
  3.         pr_mask("in sigparse1: ");
  4.                 //raise(SIGUSR2);
  5.         sleep(5);
  6.         printf("end sigparse1\n");
  7. }

  8. static void sigparse2(int sig,siginfo_t * param,void *p2){
  9.         pr_mask("in sigparse2: ");
  10.                 //raise(SIGUSR1);
  11.         sleep(5);
  12.         printf("end sigparse2\n");
  13. }

  14. int main (int argc, const char * argv[]) {
  15.         struct sigaction act;
  16.         act.sa_sigaction=sigparse1;
  17.         act.sa_flags = 0;
  18.         sigemptyset(&act.sa_mask);
  19.         sigaddset(&act.sa_mask, SIGUSR2);
  20.         sigaction(SIGUSR1, &act, NULL);
  21.         
  22.         
  23.         act.sa_sigaction = sigparse2;
  24.         act.sa_flags = 0;
  25.         sigemptyset(&act.sa_mask);
  26.                 //sigaddset(&act.sa_mask,SIGUSR1);
  27.         sigaction(SIGUSR2, &act, NULL);
  28.         
  29.         printf("start working ,send signal cmd:\nkill -s USR1 %d\n",getpid());
  30.                 //raise(SIGUSR1);
  31.                 //sleep(1);
  32.                 //raise(SIGUSR2);
  33.         pause();
  34.         sleep(25);
  35.         return 0;
  36. }
复制代码
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信号打断呢...不懂中,希望各位帮帮忙哈~谢谢~
作者: jerryz920    时间: 2010-12-19 13:08
pr_mask打印的是signal mask吧孩子,屏蔽掉的信号……

第二个例子里:

end sigparse1
in sigparse2: SIGUSR2

这不明显USR1处理完了才进入了USR2的handler么……
作者: itw1    时间: 2010-12-19 13:56
本帖最后由 itw1 于 2010-12-19 14:07 编辑

基本执行逻辑


关于sigaction的具体参数可以查看 http://www.kernel.org/doc/man-pa ... n2/sigaction.2.html
                                             http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
作者: edwardhey    时间: 2010-12-19 13:57
pr_mask打印的是signal mask吧孩子,屏蔽掉的信号……

第二个例子里:

end sigparse1
in sigparse2: ...
jerryz920 发表于 2010-12-19 13:08


忘记说明情况了~ 我的系统是mac os~ 第二个例子应该是要等待5秒后才进入SIGUSR2,可是并没有等待5秒就马上结束了,所以我认为是被中断了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2