2012-03-24 72 views
0

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

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

我想保持设计尽可能简单,但我找不到解决这个问题。

这里有一些丑陋的解决方法:

  • 设置信号灯超时。醒来。我应该关闭吗?没有?好吧,回到睡觉;
  • 只要杀了他们;
  • 共享内存中的布尔值数组,意味着响应/阻塞,守护进程会相应地终止。迄今为止最好的,但并不那么简单。

你说什么? 谢谢。

回答

1

一个干净的方法来解决这个问题是让每个侦听器等待两个信号量。第一个是你现在使用的第一个,第二个是当它变成信号时,意味着该退出了。自从您使用术语daemon以来,我相信您的系统是linux。功能select只是这样做 - 等待多个对象(如文件描述符),并在其中一个对象发出信号时返回。你也可以从函数中知道哪一个得到了信号,所以这里是你的解决方案。

在Windows的功能是WaitForMultipleObjects()

+0

哇。我喜欢这个。选择对于这种情况来说是完美的。 – Metz 2012-03-24 20:36:15

0

在过去,我已经使用了全球客户端处理线程可以用它来了解他们是否需要“清理店”,然后等待他们去完成所有,但我也很想知道,如果有一个更好的方法。 (不知道什么语言,但大多数情况下,你可以检查,看看你的线程是否仍在运行。)

+0

不能做到这一点。监听器被阻塞/在信号量上,他们不能自己做任何事情,比如检查一个变量。 – Metz 2012-03-24 20:06:45

1

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