免费注册 查看新帖 |

Chinaunix

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

关于sigaction函数 [复制链接]

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

1
  1. signal(SIGX,func1);
  2. signal(SIGX,func2);
  3. //其中SIGX为某个信号

  4. 另外signal/sigaction函数对信号能捕捉几次?
  5. 比如捕捉SIGX信号返回后,又出现一次SIGX信号,还会继续捕捉吗?

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

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

3

  1. int main()
  2. {
  3. struct sigaction action;
复制代码
///此时action.sa_handler的值是什么? 也就是声明一个 struct sigaction变量里有默认值?

  1. sigaction(SIGABRT,NULL,action)
复制代码
///此时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);
复制代码
////////////这里用NULL,是为了取得现有的处理函数,那么现有的处理函数是谁分配的? 而且必须SIGABRT递交之后才能触发sigaction函数执行从而取得&action吧?
///////////而下面开始判断action的内容,action不是要sigaction函数执行后才获得一个sigaction结构体的指针吗?怎么还没收到信号就开始判断了?

  1.     if (action.sa_handler == SIG_IGN) {
  2.         action.sa_handler = SIG_DFL;
  3.         sigaction(SIGABRT, &action, NULL);}
复制代码
//////这里加入if判断为真,就有两个sigaction函数了,
//////为何后面又有一个sigaction,kill发两次SIGABRT?

  1.     if (action.sa_handler == SIG_DFL)
  2.         fflush(NULL);           /* flush all open stdio streams */

  3.     /*
  4.      * Caller can't block SIGABRT; make sure it's unblocked.
  5.      */
  6.     sigfillset(&mask);
  7.     sigdelset(&mask, SIGABRT);  /* mask has only SIGABRT turned off */
  8.     sigprocmask(SIG_SETMASK, &mask, NULL);
  9.     kill(getpid(), SIGABRT);    /* send the signal */


  10.     /*
  11.      * If we're here, process caught SIGABRT and returned.
  12.      */
  13.     fflush(NULL);               /* flush all open stdio streams */
  14.     action.sa_handler = SIG_DFL;
  15.     sigaction(SIGABRT, &action, NULL);  /* reset to default */
  16.     sigprocmask(SIG_SETMASK, &mask, NULL);  /* just in case ... */
  17.     kill(getpid(), SIGABRT);                /* and one more time */
  18.     exit(1);    /* this should never be executed ... */
  19. }
复制代码
[/code]5 APUE里的会议首进程到底和控制终端有连接没,好像一下子又说有,一下子又说没有
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP