我有一个正在运行的线程,正在等待来自套接字的消息。线程被阻塞以等待消息,直到收到新消息才会醒来。是否有一种方法将信号发送到线程以唤醒并使接收函数(recvmsg)返回与信号相关的错误代码?
发布于 2011-04-25 18:43:07
是的,默认情况下,SIGINT将中断所有系统。来自man recv
EINTR The receive was interrupted by delivery of a signal before any
data were available; see signal(7).
and
MSG_WAITALL (since Linux 2.2)
This flag requests that the operation block until the full request is
satisfied. However, the call may still return less data than requested
if a signal is caught, an error or disconnect occurs, or the next
data to be received is of a different type than that returned.但是,您不能针对特定的线程或特定的操作。
如果您希望这样做,我建议使用接收线程可以解释侦听的条件。在linux上有一个众所周知的技巧,它允许接收线程使用select或poll侦听套接字,并使用“条件”simultaneously1进行。
诀窍是打开从主线程到客户端(接收)线程的管道。当达到某种状态时,主人会写到管道上(可以说是信号)。客户端(接收)线程可以简单地轮询管道和套接字,只检查这两个线程中哪个唤醒了它。
1通常情况下,在没有赛车的情况下,poll/select和pthread_cond_wait不能结合在一起,所以您需要编写带有小超时的等待循环。相比之下,在Win32上,它就像WaitForMultipleObjects一样简单,您就完成了
https://stackoverflow.com/questions/5781293
复制相似问题