make write()破解而不写入文件desc?

Gui*_*i13 4 c select timeout

我的应用程序中有这个线程监视一组客户端套接字.我select()用来阻止,直到客户端发出请求,这样我就可以有效地处理它而不会增加线程.

现在,问题是,当我将新客户端添加到客户端列表时,我必须等待select()(设置为10秒)的超时以实际将新套接字添加到已侦听的套接字.

所以我想在超时之前进行select()破解,以便可以立即收听客户端.

我已经有了一个解决方案:创建一个我总是包含在我的侦听套接字列表中的虚拟套接字对,并且我在其中编写以进行select()破解,但我希望有更好的解决方案.

编辑:我无法访问,eventfd()因为我使用的GLIBc太旧了(我无意更新它).所以我可能不得不使用fifo或socket.

你知道任何?

谢谢!

bdo*_*lan 7

唤醒选择循环的通常方法是将pipe()fd对的读取结尾添加到选择的观看集.当您需要唤醒选择循环时,将一些虚拟数据写入文件描述符的写入端.

请注意,在linux上你可能还想考虑使用eventfd()而不是pipe()- 它可能会更有效(虽然不太便携).

您还可以在select循环中处理listen套接字,而不是将其移交给另一个线程 - 这会在新客户端到来时隐式唤醒select循环.