正在中断accept()

Interrupting accept()

本文关键字:accept 中断      更新时间:2023-10-16

是否有一种操作系统可移植的方式来中断阻塞的accept?我有一个多线程的deamon/service,当deamon/servine收到关闭信号时,它需要优雅地关闭所有正在侦听的网络主机。我看到有人说你应该使用非阻塞套接字或超时选择,但这些不会降低性能吗?因为我的应用程序应该尽可能快?deamon在主线程中运行,而每个侦听网络主机都在自己的线程中运行。现在的问题是,如果侦听网络主机的套接字上没有网络流量,accept将无限期等待。如果我应该使用信号,那么有没有一个使用信号中断accept的例子?

这里的解决方案是在没有事情可做时不调用accept。只需使用非阻塞selectpoll等待,直到有事情可以接受,然后再调用accept。除非您创建一个非常小的超时,否则从非阻塞调用中醒来并返回等待套接字不会对性能产生任何影响。