2012-02-03 191 views
0

我有一個家長在啓動時會揭開序幕,創建在端口X.偵聽此之後TCP Server實例的一個線程,家長開始分叉關子進程(這做幾件事情並退出)。請注意,這些子進程從父進程繼承fds,因此最終在端口X上偵聽。會發生什麼?

父程序具有處理器,用於在端口X上進入的請求,但子進程沒有此類處理程序(它是一個os.execv ()-ed C++程序)

我知道,子進程可能會關閉所有的fds,在這種情況下,上述情況將不會出現。端口X上的傳入請求會發生什麼?它是如何處理的?

這是我到目前爲止所觀察到的... 家長中的tcp請求處理程序在接收請求時執行commands.getstatusoutput(..)。大多數時候,它的行爲預期(或方式,我預期) - 以上命令的執行沒有任何錯誤......但有時我得到

File "/home/y/lib/python2.7/commands.py", line 61, in getstatusoutput 
    sts = pipe.close() 
IOError: [Errno 10] No child processes 
+0

這包括一些相同的理由,作爲http://stackoverflow.com/questions/670891/is-there-a-way-for-multiple-processes-to-share-a-listening-socket(而不是Python特定) – 2012-02-03 18:39:46

回答

8

在操作系統層面上,不應該對此有任何問題。這是本質上的方式,預分叉的服務器上運行:

  1. 在主線程
  2. 綁定套接字地址
  3. 呼叫聽()創建套接字把插座成監聽模式 - 在此點,任何連接請求將被接受並排隊由操作系統
  4. 叉一堆孩子,其中每一個繼承開放套接字
  5. 然後,子處理每個調用accept(),這阻止,直到有一個連接他們來處理。

如果孩子選擇不在監聽套接字上調用accept(),(因爲你的exec'ed過程不會),那麼應該沒有任何問題,對於那個過程,或者對於那些仍然接受聯繫。

我能看到的唯一複雜因素是套接字無法關閉 - 爲了讓操作系統真正關閉它,所有引用它的進程必須調用close()其開放描述符的計數降至零。

這可能是最好的,你的情況,如果該行爲與應用程序的其餘部分的干擾,關閉監聽套接字的孩子 - 叉你,但是你之前調用exec。