存档

文章标签 ‘sigset’

【学习笔记】Linux信号,信号集

2009年11月30日 没有评论

关于Linux信号请参见这篇文章http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html

主要是为了理解下面的这段代码:

// Block all signals for background thread.
sigset_t new_mask;
sigfillset(&new_mask);
sigset_t old_mask;
pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask);

// Run server in background thread.
http::server::server s(argv[1], argv[2], argv[3]);
boost::thread t(boost::bind(&http::server::server::run, &s));

// Restore previous signals.
pthread_sigmask(SIG_SETMASK, &old_mask, 0);

// Wait for signal indicating time to shut down.
sigset_t wait_mask;
sigemptyset(&wait_mask);
sigaddset(&wait_mask, SIGINT);
sigaddset(&wait_mask, SIGQUIT);
sigaddset(&wait_mask, SIGTERM);
pthread_sigmask(SIG_BLOCK, &wait_mask, 0);
int sig = 0;
sigwait(&wait_mask, &sig);

其实代码中已经有注释了,写的很明白了。不过,俺一开始不理解的,学习了一下,记录如下。

pthread_sigmask:

int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask)
设置线程的信号屏蔽码,语义与sigprocmask()相同,但对不允许屏蔽的Cancel信号和不允许响应的Restart信号进行了保护。被屏蔽的信号保存在信号队列中,可由sigpending()函数取出。

How:

SIG_BLOCK: 结果集是当前集合参数集的并集
SIG_UNBLOCK:
结果集是当前集合参数集的差集

SIG_SETMASK:
结果集是由参数集指向的集

sigfillset(sigset_t *set)调用该函数后,set指向的信号集中将包含linux支持的64种信号;

那么第一段代码的意思就是,屏蔽(阻塞)所有的信号,目的是创建下面的业务代码

第二段:

// Restore previous signals.
恢复之前的信号。使用SIG_SETMASK,阻塞结果集由参数指定,即第一段代码执行前的信号集

第三段,Wait for signal indicating time to shut down

设定需要屏蔽(阻塞)的信号,等待,知道信号集中的信号出现。sigwait的第二个参数就是收到的在信号集中存在的信号,可以根据这个参数做出处理。

sigwait() 提供了一种等待信号的到来,以串行的方式从信号队列中取出信号进行处理的机制。sigwait()只等待函数参数中指定的信号集,即如果新产生的信号不在指定的信号集内,则 sigwait()继续等待。