2012-03-24 76 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給孩子和實現處理這個信號,以便他們完成當前請求並優雅地退出。 如果他們在信號量上等待,您應該使用可中斷模式,以便接收信號將喚醒它們。