我正在编写一个http服务器。主守护进程会产生一堆侦听器,这些侦听器是线程或进程,具体取决于用户设置。创建一个监听器后,套接字描述符被传递给它,它的工作就是监听连接(duh)。信号量正在将呼叫包裹到listen
,以避免雷鸣般的群体效应。
我的问题是如何退出服务器。在这种情况下,监听器在信号量上被阻塞,守护进程如何告诉它们关闭?守护进程不能只是杀死它们,也许某人正在响应请求......
我想让设计尽可能简单,但我找不到解决这个问题的方法。
以下是一些丑陋的解决方法:
你怎么说? 感谢。
答案 0 :(得分:1)
发送SIGTERM,或者,如果您愿意,发送SIGUSR给孩子并实施此信号的处理,以便他们完成当前请求并优雅地退出。 如果他们等待信号量,你应该使用可中断模式,以便接收信号将其唤醒。
答案 1 :(得分:1)
解决此问题的一种简洁方法是让每个侦听器等待两个信号量。第一个是你现在使用的第一个,第二个是当发出信号时,表示是时候退出了。我相信你的系统是linux,因为你使用了术语daemon
。函数select
就是这样做的 - 等待多个对象(像文件描述符一样),并在其中一个对象发出信号时返回。你也从函数中知道了哪一个已经发出信号,所以这是你的解决方案。
在Windows上,该功能为WaitForMultipleObjects()
答案 2 :(得分:0)
在过去,我使用了一个全局客户端处理线程可以用来查明他们是否需要“清理商店”然后等待他们全部完成但我也有兴趣知道是否有更好的方式。 (不确定是什么语言,但在大多数情况下,您可以检查您的线程是否仍在运行。)