中断接受()

3 c c++ sockets networking winsock

是否存在OS便携式中断阻塞的方法accept?我有一个多线程守护进程/服务,当deamon/service获得关闭信号时,需要正常关闭所有侦听网络主机.我看到有人说你应该使用非阻塞套接字或选择超时 - 但这些会不会降低性能,因为我的应用程序应尽可能快?守护进程在主线程中运行,而每个侦听网络主机都在自己的线程中运行.现在的问题是,accept如果侦听网络主机的套接字上没有网络流量,则无限期地等待.如果我应该使用信号,那么有一个使用信号中断的例子accept吗?

Mar*_*k B 5

这里的解决方案是在没有accept任何事情要求时不要打电话.只需使用非阻塞selectpoll等到有东西可以接受,然后accept就此.除非你创建一个非常小的超时,否则从非阻塞调用中唤醒并返回再次等待该套接字将不会有任何性能影响.

  • 阻止选择或轮询也会起作用,并且与等待超时相比,CPU效率更高,响应时间更快.你只需要一种方法来告诉select()/ poll()唤醒.通常你会使用pipe或socketpair()来做那个...在管道/ socketpair的一端(当然还有accept套接字)上有select()wait-for-read-ready,然后到随时唤醒select(),将一个字节写入管道/ socketpair的另一端. (4认同)