退出多线程/多进程Web服务器

时间:2012-03-24 19:56:25

标签: c multithreading multiprocessing

我正在编写一个http服务器。主守护进程会产生一堆侦听器,这些侦听器是线程或进程,具体取决于用户设置。创建一个监听器后,套接字描述符被传递给它,它的工作就是监听连接(duh)。信号量正在将呼叫包裹到listen,以避免雷鸣般的群体效应。

我的问题是如何退出服务器。在这种情况下,监听器在信号量上被阻塞,守护进程如何告诉它们关闭?守护进程不能只是杀死它们,也许某人正在响应请求......

我想让设计尽可能简单,但我找不到解决这个问题的方法。

以下是一些丑陋的解决方法:

  • 设置信号量的超时。醒来。我应该关闭吗?没有?好的,回去睡觉;
  • 杀了他们;
  • 共享内存中的布尔数组,意思是响应/阻塞,守护程序相应地杀死。到目前为止最好的,但不是那么简单。

你怎么说? 感谢。

3 个答案:

答案 0 :(得分:1)

发送SIGTERM,或者,如果您愿意,发送SIGUSR给孩子并实施此信号的处理,以便他们完成当前请求并优雅地退出。 如果他们等待信号量,你应该使用可中断模式,以便接收信号将其唤醒。

答案 1 :(得分:1)

解决此问题的一种简洁方法是让每个侦听器等待两个信号量。第一个是你现在使用的第一个,第二个是当发出信号时,表示是时候退出了。我相信你的系统是linux,因为你使用了术语daemon。函数select就是这样做的 - 等待多个对象(像文件描述符一样),并在其中一个对象发出信号时返回。你也从函数中知道了哪一个已经发出信号,所以这是你的解决方案。

在Windows上,该功能为WaitForMultipleObjects()

答案 2 :(得分:0)

在过去,我使用了一个全局客户端处理线程可以用来查明他们是否需要“清理商店”然后等待他们全部完成但我也有兴趣知道是否有更好的方式。 (不确定是什么语言,但在大多数情况下,您可以检查您的线程是否仍在运行。)