日期:2014-05-16  浏览次数:20650 次

Linux中,main函数下面写的,有关几个信号处理函数?
sigset_t signal_mask;
sigemptyset (&signal_mask);
sigaddset (&signal_mask, SIGPIPE);
int rc = pthread_sigmask (SIG_BLOCK, &signal_mask, NULL);

这个函数和它们的参数都是什么意思啊?
linux

------解决方案--------------------

在多线程的程序里,希望只在主线程中处理信号,可以使用
 
函数:
int pthread_sigmask (int how,
const sigset_t *set,
sigset_t *oset)

      用作在主调线程里控制信号掩码。
 
How:
SIG_BLOCK:     结果集是当前集合参数集的并集
SIG_UNBLOCK:  结果集是当前集合参数集的差集
SIG_SETMASK:  结果集是由参数集指向的集

------解决方案--------------------
sigset_t signal_mask;//定义一个信号集变量
sigemptyset (&signal_mask);//把变量清空为空的信号集
sigaddset (&signal_mask, SIGPIPE);//往信号集中加入信号SIGPIPE
int rc = pthread_sigmask (SIG_BLOCK, &signal_mask, NULL);//设置进程屏蔽字,新的线程会继承它的创建线程的信号屏蔽字


原型为:int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
它可以根据how的值来修改进程的屏蔽字,与sigprocmask相似,但是它明确是应用于线程中。成功返回0,失败返回错误码。
新的信号屏蔽字由参数set(非空)指定,而原先的信号屏蔽字将保存在oset(非空)中。如果set为空,则how没有意义,但此时调用该函数,如果oset不为空,则把当前信号屏蔽字保存到oset中。

how的不同取值及操作如下所示:
SIG_BLOCK    :把参数set中的信号添加到信号屏蔽字中
SIG_SETMASK  :把信号屏蔽字设置为set中的信号
SIG_UNBLOCK  :从信号屏蔽字中删除参数set中的信号

ps:可以输入man 3 pthread_sigmask