Linux 主调线程里控制信号掩码
时间:2010-04-19 来源:gogozhaoxinfeng
主调线程里控制信号掩码
在BOSS/WORKER IO 模式中,主线程创建任务交给子线程去处理,主线程一般设置为阻塞,然后接受输入或信号 。一般使main 线程同步阻塞在信号处理上。比如当接受到SIGHUP时,重新读入配置等等....
#include <signal.h>
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);
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();
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();
相关阅读 更多 +