线程与信号

信号在单线程进程中处理比较容易,在多线程进程中就变得有些复杂了。在多线程中,每个线程都有自己的信号屏蔽字,但是信号的处理却是进程中所有线程共享的,即如果一个线程修改了某个信号的处理方式,所有线程都将共享此修改。
       多线程中信号的递送:当一个信号是硬件故障引起的,那么此信号一般发送到引起此硬件故障的线程,而其他信号则被发送到任意一个线程。
       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)
       如有错误,请给予指出,共同进步!!!

你可能感兴趣的:(线程与信号)