免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7292 | 回复: 3
打印 上一主题 下一主题

[C] [已解决]对信号函数sigaction的sa_mask的疑惑,求解疑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-19 09:16 |只看该作者 |倒序浏览
本帖最后由 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信号打断呢...不懂中,希望各位帮帮忙哈~谢谢~

论坛徽章:
0
2 [报告]
发表于 2010-12-19 13:08 |只看该作者
pr_mask打印的是signal mask吧孩子,屏蔽掉的信号……

第二个例子里:

end sigparse1
in sigparse2: SIGUSR2

这不明显USR1处理完了才进入了USR2的handler么……

论坛徽章:
0
3 [报告]
发表于 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

论坛徽章:
0
4 [报告]
发表于 2010-12-19 13:57 |只看该作者
pr_mask打印的是signal mask吧孩子,屏蔽掉的信号……

第二个例子里:

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


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP