Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397279
  • 博文数量: 48
  • 博客积分: 1820
  • 博客等级: 上尉
  • 技术积分: 705
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-28 23:10
文章分类

全部博文(48)

文章存档

2012年(1)

2011年(12)

2010年(34)

2009年(1)

分类: C/C++

2010-04-19 10:42:34

 

主调线程里控制信号掩码

在BOSS/WORKER IO 模式中,主线程创建任务交给子线程去处理,主线程一般设置为阻塞,然后接受输入或信号 。一般使main 线程同步阻塞在信号处理上。比如当接受到SIGHUP时,重新读入配置等等....

 #include

       int pthread_sigmask(int how, const sigset_t *restrict set,
              sigset_t *restrict oset);

       int sigprocmask(int how, const sigset_t *restrict set,
              sigset_t *restrict oset);

How:

SIG_BLOCK:     结果集是当前集合参数集的并集
SIG_UNBLOCK:
结果集是当前集合参数集的差集
SIG_SETMASK:
结果集是由参数集指向的集

1. 初始化一个信号集合
  sigset_t new_mask;
  sigfillset(&new_mask);
/***
sigfillset() initializes set to full, including all signals.
初始化一个信号集合,包含所有的信号。
**/
2.  获得当前信号集合
pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask);
//! 进程信号集首先会变成new_mask(包含所有信号),并且设置前的信号集被保存到old_mask 。

3. 设置新的信号集合掩码
    sigset_t wait_mask;
    sigemptyset(&wait_mask);
    sigaddset(&wait_mask, SIGINT);
    sigaddset(&wait_mask, SIGQUIT);
    sigaddset(&wait_mask, SIGTERM);
    sigaddset(&wait_mask, SIGHUP);
    pthread_sigmask(SIG_BLOCK, &wait_mask, 0);

4. 主线阻塞,同步获得信号
   int sig = 0;
   sigwait(&wait_mask, &sig);
//! @brief 此函数将阻塞,直到收到一个满足wait_mask中的任何一个信号,信号的值将保存到sig变量中。

5. 识别信号,进行相应的处理.
  while(flag)
    {
        sigwait(&wait_mask, &sig);
        if(SIGHUP == sig)
        {
            process_sighup() ;
        }
        else
           flag = false;
    }
   //! 其他信号,进程退出
   stop();


   
阅读(2085) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~