免费注册 查看新帖 |

Chinaunix

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

[函数] 关于 sigaction 和 会议首进程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-30 06:45 |只看该作者 |倒序浏览
本帖最后由 davidmalone 于 2011-08-30 09:16 编辑

1
  1. signal(SIGX,func1);
  2. signal(SIGX,func2);
  3. //其中SIGX为某个信号
复制代码
或者

  1. sigaction(SIGX,&act1,&oact);
  2. sigaction(SIGX,&act2,&oact);
复制代码
是不是第二个signal/sigaction导致第一个不起作用?
另外signal/sigaction函数对信号能捕捉几次?
捕捉一次调用信号处理程序返回后还能捕捉吗?

2
  1. sigaction(SIGX,&act1,&oact);
  2. sigaction(SIGX,&act2,&oact);
复制代码
假如&act1 和&act2 里的sa_mask设置不同
第一个sigaction将act1里sa_mask指定信号集加入当前进程的屏蔽字里
那第二个sigaction怎么处理act2的sa_mask指定的信号集?同样也加入当前信号屏蔽字?

另外,如果主线程用sigaction将sa_mask指定的信号集加入屏蔽字
同一进程中的其他线程受影响吗?

3
  1. struct sigaction action;
  2. ///此时action.sa_handler的值是什么?

  3. sigaction(SIGABRT,NULL,action)
  4. ///此时action.sa_handler的值是什么?我在ubuntu下测了这时变为 SIG_DFL,为什么//会变成SIG_DFL?
复制代码
4APUE里的abort函数


  1. void
  2. abort(void)         /* POSIX-style abort() function */
  3. {
  4.     sigset_t           mask;
  5.     struct sigaction   action;

  6.     /*
  7.      * Caller can't ignore SIGABRT, if so reset to default.
  8.      */
  9.     sigaction(SIGABRT, NULL, &action);
  10. ////////////这里为何用NULL,这表示接收到SIGABRT信号后不执行任何动作?
  11. ///////////而下面开始判断action的内容,action不是要sigaction函数执行后才获得一个sigaction结构体的指针吗?怎么还没收到信号就开始判断了?

  12.     if (action.sa_handler == SIG_IGN) {
  13.         action.sa_handler = SIG_DFL;
  14.         sigaction(SIGABRT, &action, NULL);
  15. //////这里加入if判断为真,就有两个sigaction函数了,那后面的sigaction函数会把前面的sigaction函数给刷掉?让第一个sigaction不发挥功能?
  16. //////为何后面又有一个sigaction,kill发两次SIGABRT?
  17.     }
  18.     if (action.sa_handler == SIG_DFL)
  19.         fflush(NULL);           /* flush all open stdio streams */

  20.     /*
  21.      * Caller can't block SIGABRT; make sure it's unblocked.
  22.      */
  23.     sigfillset(&mask);
  24.     sigdelset(&mask, SIGABRT);  /* mask has only SIGABRT turned off */
  25.     sigprocmask(SIG_SETMASK, &mask, NULL);
  26.     kill(getpid(), SIGABRT);    /* send the signal */
  27. /////////这个时候第一个sigaction函数捕捉到SIGABRT信号,那么因为有NULL,所以信号捕捉函数为空,即不执行任何动作?然后action也赋值NULL???

  28.     /*
  29.      * If we're here, process caught SIGABRT and returned.
  30.      */
  31.     fflush(NULL);               /* flush all open stdio streams */
  32.     action.sa_handler = SIG_DFL;
  33.     sigaction(SIGABRT, &action, NULL);  /* reset to default */
  34.     sigprocmask(SIG_SETMASK, &mask, NULL);  /* just in case ... */
  35.     kill(getpid(), SIGABRT);                /* and one more time */
  36.     exit(1);    /* this should never be executed ... */
  37. }


复制代码
5 APUE里的会议首进程到底和控制终端有连接没,好像一下子又说有,一下子又说没有

论坛徽章:
0
2 [报告]
发表于 2011-08-30 21:59 |只看该作者
哪位大侠帮忙解惑,谢谢,呵呵

论坛徽章:
3
金牛座
日期:2013-10-12 15:42:452015年辞旧岁徽章
日期:2015-03-03 16:54:15IT运维版块每日发帖之星
日期:2016-06-01 06:20:00
3 [报告]
发表于 2011-08-31 02:28 |只看该作者
1. sigaction(SIGX,&act1,&oact);
   2. sigaction(SIGX,&act2,&oact);
-----------
按语意肯定第二个把第一个调用设定的act1冲掉啊,从oact里返回了。
至于捕捉一次信号后是不是恢复原来的处理函数,这个可以通过参数控制啊。


sigaction(SIGABRT, NULL, &action);
-----------
传NULL是不设定新的处理函数,只通过&oldaction获得现有的处理函数。


sigaction(SIGABRT, &action, NULL);
-----------
是设定新的处理函数,但是不取得旧的处理函数。


线程有专用的处理信号的函数,这些函数是处理进程的,按理是影响整个进程,没试过。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP