2015-10-07 38 views
0

信号掩码可以在每个线程的基础上设置,但信号处理是什么?如果我在pthread_create()创建新线程之前调用sigaction(),新线程是否会获得相同的信号处理程序?如果我在pthread_create()之后使用sigaction(),会改变整个进程信号处理程序还是仅改变线程的那些处理程序?在linux上使用带有POSIX线程的信号

+0

你看过[信号(7)](http://man7.org/linux/man-pages/man7/signal.7.html)? –

回答

2

每个进程只有一个信号处理程序。所以线程在这里没有任何关联。信号处理程序在接收信号的线程环境中调用。如果多个线程没有阻止信号,那么哪个线程接收信号不被指定。

如果多个线程在系统调用中等待,您必须小心。你也必须注意使用计时器动作和呼叫进入睡眠状态。

您也可以找到这个答案有帮助:POSIX threads and signals

+0

好的,谢谢你的回答。信号传递是异步还是延迟? 'pthread_cancel()'可以被tweeked,但是'pthread_kill()'呢?我读到的信号确实使用取消点,但即使系统调用它们也会中断。 – Kouros

+1

'信号处理程序是在它自己的上下文中调用的,它不是线程的一个。' - 否根据[man signal(7)](http://man7.org/linux/man-pages/man7/signal .7.html):'一个流程控制的信号可能被传送到当前没有信号被阻塞的线程中的任何一个线程。'# – Tsyvarev

+0

@Kouros几乎每个系统调用都会被信号中断。所以你必须检查返回值。如果处理了信号,通常会返回'EINTR'。 – Klaus