sigwait函数详解
int sigwait(const sigset_t *restrict sigmask, int* restrict signo);
sigwait函数一直阻塞直到*sigmask指定的任何一个信号被挂起为止,然后从挂起信号集中删除那个信号,并解除对它的阻塞。当sigwait返回时,从挂起信号集中删除的信号的个数被存储在signo指定的那个位置中。 |
信号是向进程发送的软件通知,通知进程有事件发生。引发信号的事件发生时,信号就被生成了。进程根据信号采取行动时,信号就被传递了。信号的寿命就是信号的生成和传递之间的时间间隔。已经生成但还未被传递的信号被称为挂起的信号。在信号生成和信号传递之间可能会有相当长的时间。
挂起就是未决pending(未处理的)
信号类似于处理事务
1。有事情发生了(信号产生)
2。该事情通知了有关部门,他们已登记在一个未处理事件的本子上(信号传递给目标进程,目标进程登记该信号到本进程的task_struct结构)
3。有关部门定期检查未处理事件的本子,发现有事情没处理时,就注销该事件(目标进程会检测是否有信号等待处理,如果有未决信号等待处理且该信号没有被进程阻塞,则在运行相应的信号处理函数前,进程会把信号在未决信号链中占有的结构卸掉)
4。最后有关部门去实施事件的处理。(进程注销信号后,立即执行相应的信号处理函数,执行完毕后,信号的本次发送对进程的影响彻底结束。)
int sigwait(const sigset_t *restrict sigmask, int* restrict signo);
sigwait函数一直阻塞直到*sigmask指定的任何一个信号被挂起为止,然后从挂起信号集中删除那个信号,并解除对它的阻塞。当sigwait返回时,从挂起信号集中删除的信号的个数被存储在signo指定的那个位置中。
这里的sigwait是阻塞本进程,去等待指定的信号。等到了就会解除阻塞。
函数名:
-
不要在线程的信号掩码中阻塞不能被忽略处理的两个信号 SIGSTOP 和 SIGKILL。
-
不要在线程的信号掩码中阻塞 SIGFPE、SIGILL、SIGSEGV、SIGBUS。
-
确保 sigwait() 等待的信号集已经被进程中所有的线程阻塞。
-
在主线程或其它工作线程产生信号时,必须调用 kill() 将信号发给整个进程,而不能使用 pthread_kill() 发送某个特定的工作线程,否则信号处理线程无法接收到此信号。
-
因为 sigwait()使用了串行的方式处理信号的到来,为避免信号的处理存在滞后,或是非实时信号被丢失的情况,处理每个信号的代码应尽量简洁、快速,避免调用会产生阻塞的库函数。
On success,sigwait() returns 0. On error, it returns a positive error number.
来源:
http://www.xuebuyuan.com/727702.html
http://baike.baidu.com/link?url=pEPpXKkCenonm9snnPwabsvrocU5LSUwW0Vn6x8sFX87xD-JSi2SswZi_FaREkGjJQsTihzqWZKy0J71zvXSRK