多线程和多进程中几个信号函数的比较

如何使安全使用信号中,我们已经简单的介绍了
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
 int sigsuspend(const sigset_t *mask);
函数,它在处理进程中的信号处理是相当出色的。为了便于理解多线程中对应的信号处理函数,我将在这里再次说明一下他们的作用和对应的参数 。
首先看sigprocmask函数,它被使用于改变当前阻塞信号,how参数决定它的行为。
1)SIG_BLOCK  set参数决定将要被阻塞的信号集合
2)SIG_UNBLOCK set参数决定将要非阻塞的信号集合
3)SIG_SETMASK set参数将被用于替换掉当前阻塞信号集合
oldset是返回上次阻塞信号集合的值,一般情况下用于恢复操作。

sigsuspend函数是用于将mask的值临时替换掉当前进程的信号集合值并进入block状态。当信号被接受到的时候,唤醒进程,并恢复原来的信号集合值。

在多进程信号处理的时候,上面两个函数是非常有用的。可是,它们对于多线程环境,是线程不安全的,那么如何来完成上述两个函数所描述的功能呢?幸运的是,posix提供了对应的多线程安全的信号处理函数:
int pthread_sigmask(int how, const sigset_t  *newmask,  sigset_t  *oldmask);
int sigwait(const sigset_t *set, int *sig);

pthread_sigmask的使用方法和sigprocmask是完全一致的,仅仅的差别在于一个是多线程的一个是多进程的。
sigwai函数比sigsuspend函数多了一个参数,前一个参数的意义和使用是完全一致的,后一个参数主要是用户获取接收到信号的信号编号值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值