2016-05-02 35 views
1

我使用recv()来从套接字读取数据,并且使用fcntl()来设置套接字阻塞/非阻塞。我的问题是:如果我调用recv()(阻塞),并且我从另一个线程调用fcntl()并设置套接字非阻塞,那么当前正在运行的recv()返回或fcntl()的效果将仅在阻塞recv()返回后发生,我称之为再次?Blocking recv()vs fcntl()

+2

试一试。奇怪的是,你想要一个套接字既是阻塞又是非阻塞的,并且有另一个线程处理状态。在linux上,我将使用客户端上的socket()和服务器上的accept4()来设置创建时的套接字非阻塞。 –

+0

你只是试图异步唤醒一个阻塞在'recv'调用的线程吗?如果是这样,即使'fcntl'产生期望的结果,也可能有更好/更安全的方法。例如,使用'poll'来阻止外部'recv'套接字*或*一个仅用于进程内通知的内部套接字。 –

+0

@BrianMcFarland这正是我计划要做的事情,但由于它根本不可行(根据EJP的回答),我会研究你的想法。谢谢! –

回答

2

它不会影响当前的接收操作。

奇怪的事情要做。

+0

感谢您的回答!我想用这种方法唤醒阻塞线程,但我想我会考虑其他选项。 –

+0

@BertalanRadostyan:“*我想唤醒阻塞线程*”只需发送线程信号(确保'SA_RESTART'不是信号处理程序)。 – alk