线程与信号
来源:互联网 发布:python列表和元组 编辑:程序博客网 时间:2024/05/22 09:46
信号在单线程进程中处理比较容易,在多线程进程中就变得有些复杂了。在多线程中,每个线程都有自己的信号屏蔽字,但是信号的处理却是进程中所有线程共享的,即如果一个线程修改了某个信号的处理方式,所有线程都将共享此修改。
多线程中信号的递送:当一个信号是硬件故障引起的,那么此信号一般发送到引起此硬件故障的线程,而其他信号则被发送到任意一个线程。
sigprocmask函数是为单线程进程定义的,在多线程中应调用pthread_sigmask函数。
信号的处理是异步事件,在单线程进程中,只能进行异步处理,但在多线程中,可以转化成同步处理,用一个线程专门对信号进行处理,这时用到一个函数sigwait函数:
int sigwait(const sigset_t *restrict set, int *restrict signop);
@set参数:指定了调用线程要等待的信号集
@signop参数:指向的整形数据将包含发送信号的编号(注意:在中文版的apue中翻译有误,不是信号数量,而是信号值)
在专门处理信号的线程中调用sigwait函数来实现信号的异步处理转同步处理。在线程中处理信号,而不用signal或sigaction安装信号处理函数的好处是:1.简化信号处理;2.不必担心函数是否信号安全,只要线程安全即可。当在专门处理信号的线程中调用sigwait函数之前,所有线程必须阻塞要等待的信号,所有可以在main函数的开始调用pthread_sigmask将要等待的信号进行屏蔽,等到创建其他线程时,创建的线程会继承此屏蔽字。在线程调用sigwait时,该函数会原子的取消等待信号集中的阻塞状态,直到有新信号被递送,在返回之前,再恢复线程的信号屏蔽字。如果要等待的信号处于挂起状态,sigwaig立即返回,并清除该信号挂起状态。如果要等待信号在sigwait被调用前处于未阻塞状态,那么在线程完成对sigwait的调用之前会出现一个时间窗,在这个时间窗中,信号可能被发送给了其他线程。
关于多个线程同时调用sigwait等待同一信号;信号被捕获(调用sigaction或signal建立了一个信号处理程序),同时一个线程在sigwait等待同一信号,系统的处理方式请参阅apue中的描述。
pthread_kill函数向线程发送信号。
apue中的sigwait,异步信号处理转化为同步处理的例子看看。理解一下怎么应用。(中文版apue第三版p365)
如有错误,请给予指出,共同进步!!!
0 0
- 线程与信号
- 线程与信号
- 线程与信号
- 线程与信号
- 信号与线程
- 线程与信号
- 线程与信号
- 线程与信号
- 线程与信号
- 进程与信号、线程与信号
- 线程与信号,线程与锁
- Linux中线程与信号
- [glibc-manual]34.9 线程与信号处理
- 跨线程的信号与槽
- 异步信号安全(可重入性)与线程安全
- 异步信号安全(可重入性)与线程安全
- 异步信号安全(可重入性)与线程安全
- 异步信号安全(可重入性)与线程安全
- cronexpression 详解
- javascript闭包的作用域
- 支付宝支付
- python微教程---第一季(第一集)----python的安装
- 最全Pycharm教程
- 线程与信号
- Linux下python matplotlib.pyplot在图像上显示中文的问题
- android5 Ripple和Reveal动效
- 方格取数问题(最大流)
- 牢骚发完了,还要继续,android 圆形的过渡动画
- Java反射(一)----- Class类的使用
- HYSBZ-1067 降雨量
- Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享
- 执行shell脚本时提示bad interpreter:No such file or directory的解决办法