在信号处理程序中,堆栈的其余部分会发生什么?

时间:2015-04-21 21:21:33

标签: unix pthreads signals tcpsocket

我在主线程中设置了一个信号处理程序。然后一个单独的线程向我的主线程发送此信号。我的信号处理程序被正确调用,但我不确定主线程的“状态”是什么,以及是否可以恢复。基本上,我的主线程在read()调用时被阻塞,而另一个线程由于异常事件而向它发送了一个信号。因此我想让read()调用失败(EINTR?),因此我的另一个线程向主线程发送此信号。

1 个答案:

答案 0 :(得分:1)

这取决于您如何安装信号处理程序。如果信号处理程序是使用sigaction()安装的,并且未指定SA_RESTART标记,那么read()如果尚未传输任何数据,则会EINTR失败。

通常,处理信号的线程可以在信号处理程序返回后正常继续。这真的是重点。

请记住,在read()成功返回之后,信号可能只是到达 - 或者更糟糕的是,只有之前你调用了{{1 (在这种情况下,read()仍会阻止)。