【发布时间】:2017-11-27 10:38:16
【问题描述】:
我有一个简单的套接字服务器,我在 linux 和 Windows 上用 C 语言实现了它,但我很难干净地关闭它。
它创建一个套接字,绑定它,然后调用listen。然后,它使用 select 循环以检测新连接,以及任何当前连接的客户端套接字上的读取活动。关闭套接字的客户端很好,可以唤醒选择,我遇到的问题是干净地关闭循环。我天真地从另一个线程关闭了服务器套接字(我正在侦听和接受的那个),或者响应信号或 Ctrl-C,但这未能唤醒选择,这让我感到惊讶。
如有必要,我可以使用自我管道技巧等待选择(创建一个先进先出并将读取端也包含在选择列表中,然后在我想关闭时写入它),但这不会是考虑到代码的结构,非常方便。 我只是想知道这是否是预期的行为,我是否希望我的选择在我关闭服务器套接字时唤醒。它确实在 Windows 上以这种方式工作。
谢谢。
【问题讨论】:
-
你的监听套接字是否在 select() 的 read fd 集中?
-
你能简单地定位一个全局变量并用 pthread_kill 向选择线程发送信号吗?