免费注册 查看新帖 |

Chinaunix

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

[Linux] 进入信号处理函数,是不是会自动把进入信号加入信号屏蔽字 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-03 18:06 |只看该作者 |倒序浏览
进入信号处理函数,是不是会自动把进入信号加入信号屏蔽字?还有sigpendin()是什么意思,怎么用?

是不是 要用sigsetjmp(),siglongjmp()进入信号处理函数才会自动把进入信号加入信号屏蔽字?

论坛徽章:
0
2 [报告]
发表于 2012-09-04 09:39 |只看该作者
哎,没人回答。。。

论坛徽章:
0
3 [报告]
发表于 2012-09-04 11:10 |只看该作者
不懂,继续关注....

论坛徽章:
0
4 [报告]
发表于 2012-09-04 15:15 |只看该作者
。。。自问自答,错了请喷
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

sigset_t set;

void print(int signo)
{
  printf("handle SIGINT in print()!!!\n");
}

void catch(int signo)
{
  printf("\nin catch()...\n");
  signal(SIGINT, print);
  sleep(5);
  sigpending(&set);
  if(sigismember(&set, SIGINT))
  printf("block SIGINT!!!\n");
  printf("out catch()...\n");
}

int main()
{
  signal(SIGINT, catch);
  while(1)
  {
  printf("in main()...\n");
  sleep(1);
  }
}

coolulu@ubuntu:~/code/syscall$ ./signal1
in main()...
in main()...
^C
in catch()...
^C^C^Cblock SIGINT!!!
out catch()...
handle SIGINT in print()!!!         <-如apue所说,只产生一次信号
in main()...
in main()...
in main()...
^Chandle SIGINT in print()!!!
in main()...
^Chandle SIGINT in print()!!!
in main()...
^Chandle SIGINT in print()!!!
in main()...
^\Quit
coolulu@ubuntu:~/code/syscall$  

这样说明了在 信号处理函数catch中^C被block,  
在信号处理函数catch中的 signal(SIGINT, print)永远收不到^C

论坛徽章:
0
5 [报告]
发表于 2012-10-11 16:26 |只看该作者
signal函数在执行信号处理函数期间是屏蔽的该信号的,但是可以使用sigaction()函数设置在执行信号处理函数期间不屏蔽该信号。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP