线程与信号

本文介绍了线程如何处理信号,包括使用pthread_sigmask阻止信号、sigwait等待信号以及通过pthread_kill向线程发送信号等。此外,还讨论了信号处理在多线程环境中的共享特性及注意事项。
摘要由CSDN通过智能技术生成

/*********************************************************************
* Author : Samson
* Date : 05/30/2012
* Test platform:
* GNU Linux version 2.6.29.4
* gcc version 4.4.0 20090506 (Red Hat 4.4.0-4) (GCC)

* *******************************************************************/


每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的。这意味着尽管单个线程可以阻止某些信号,但当线程修改了与某个信号相关的处理行为以后,所有的线程都必须共享这个处理行为的改变。若一个线程选择忽略某个信号,而其他的线程可以恢复信号的默认处理行为,或者为信号设置一个新的处理程序,从而可以撤销上述线程的信号选择。


进程可以使用sigprocmask来阻止信号发送。在多线程中则使用pthread_sigmask。
int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
线程可以通过调用sigwait等待一个或多个信号发生。
int sigwait(const sigset_t *set, int *sig);
set参数指出了线程等待的信号集,sig指向的整数将作为返回值,表明发送信号的数量。
若信号集中的某个信号在sigwait调用的时候处于未决状态,那么sigwait将无阻塞地返回,在返回之前,sigwait将从进程中移除那些处于未决状态的信号。为了避免错误动作发生,线程在调用sigwait之前,必须阻塞那些它正在等待的信号。sigwait函数会自动取消信号集的阻塞状态,直到有新的信号被递送。在返回之前,sigwait将恢复线程的信号屏蔽字。若信号在sigwait调用的时候没有阻塞,在完成对sigwait调用之前会出现一个时间窗,在这个窗口期,某个信号可能在线程完成sigwait调用之前就被递送了。

若多个线程在sigwait调用时,等待的是同一个信号,这时就会出现线程阻塞。当信号递送的时候,只有一个线程可以从sigwait中返回。如果信号被捕获,而且线程正在sigwait调用中等待同一信号,那么这时将由操作系统实现来决定以何种方式递送信号。在这种情况下,操作系统实现可以让sigwait返回,也可以激活信号处理程序,但不可能出现两者皆可的情况。

把信号发送到的进程,可以调用kill;要把信号了送到线程,可以调用pthread_kill。
int pthread_kill(pthread_t thread, int sig);
可以传一个0值的sig来检查线程是否存在。若信号默认处理动作是终止进程,那么把信号传递给某个线程仍然会杀掉整个进程。
注意:闹钟定时器是进程资源,并且所有的线程共享相同的alarm。所以进程中的多个线程不可能互不干扰(或互不合作)地使用闹钟定时器。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值