免费注册 查看新帖 |

Chinaunix

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

Linux 信号集 浅析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:51 |只看该作者 |倒序浏览
Linux信号有多种说法。一个进程创建一个信号用于发送给另外一个进程叫做发送一个信号,内核创建一个信号叫做生成一个信号,进程自己向自己发送信号叫做唤起一个信号。不过我看也没必要这么学究气。
  信号集--signel set,其实就是将多个信号放在集合中进行集中的处理。POSIX.1定义了sigset_t以包涵一个信号集,并且定义了五个处理信号的函数:
  int sigemptyset(sigset_t *set);
  int sigfillset(sigset_t *set);
  int sigaddset(sigset_t *set,int signo);
  int sigdelset(sigset_t *set,int signo)
  int sigismember(const sigset_t *set,int signo);
  还有一个重要的函数:int sigprocmask(int how,const sigset_t *restrict set,sigset_t *restrict oset);
  单纯讲这些函数很难讲明白,下面结合程序来讲,程序来自UNIX环境高级编程:
  
   static void sig_quit(int);   //信号处理函数
   int main( )
  {
     sigset_t newmask,oldmask,pendmask;
     if(signal(SIGQUIT,sig_quit)==SIG_ERR)
            err_sys("can not catch SIGQUIT");
     -----------------------------------------------------------------------------------------------------------
     sigemptyset(&newmask);    //清空信号掩码集newmask,不阻塞任何信号
     sigaddset(&newmask,SIGQUIT);  //将SIGQUIT信号放入信号集newmask中去
    
     if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0) //将oldmask 和newmask合并
             err_sys("SIG_BLOCK error");  //当前信号屏蔽字放在newmask里,以前的放在oldmask里
    
     sleep(5);
     if(sigpending(&pendmask)<0)   //保存所有被阻塞的信号,本例即保存SIGQUIT到pendmask中去
              err_sys("sigpending error");
     if(sigismember(&pendmask,SIGQUIT)) //测试SIGQUIT是否在信号掩码集pendmask中
              err_sys("SIGQUIT pending");
     if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)  //将信号屏蔽字恢复为原来的信号集
              err_sys("SIG_SETMASK error");
     printf("SIGQUIT unblocked");
     sleep(5);
     exit(0);
}
static  void sig_quit(int signo)
{
   if(signal(SIGQUIT,SIG_DFL)==SIG_ERR)
               err_sys("can not reset SIGQUIT");
}
   
  这个就是这几个函数的作用。通过实例来讲解,理解会更加明白一些
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP