我有一個父進程,它創建2個服務器套接字並在它們上調用select()
來等待新的連接。當連接到達時,一條消息被髮送到一個子進程(在創建服務器套接字之後,使用fork()
創建,因此它們被共享)。爲什麼select()在父進程中使accept()在子進程中不可用?
在這個孩子,在服務器套接字上調用accept()
不起作用。我得到了一個EAGAIN
錯誤(非阻塞套接字)。而在主流程中調用accept()
完美運作。
當然,我根本不會在主流程中調用accept()
,我只是測試了一下以檢查它是否工作,並且確實如此。
爲什麼我不能在父母的select()
之後的子進程中調用accept()
?
編輯:這裏的目標是創建一個固定數量的工人(比方說8)來處理客戶端連接,就像在prefork模型中一樣。這些連接將是長連接,不像HTTP。目標是負載均衡工作人員之間的連接。
爲此,我使用一個共享內存變量,它爲工作人員包含當前連接的客戶端的數量。我想「問」具有最少數量的客戶端的工作人員來處理新的連接。
這就是爲什麼我在父級中執行select()
,然後將消息發送給子進程,因爲我想「選擇」哪個進程將處理新的連接。
服務器監聽一個以上的插座(一個用於SSL,一個沒有),這就是爲什麼我在孩子過程中使用select()
並沒有直接accept()
,因爲我可以在我的孩子們的工人多插座不accept()
。
EAGAIN並不是真正的錯誤,它只是意味着呼叫是非阻塞的,但沒有連接準備就緒。只是睡一會兒,然後再試一次。當然,除EAGAIN之外的任何其他錯誤都是實際的錯誤。 – 2012-04-13 14:07:55
爲什麼不在fork之前先調用'accept'?特別是因爲你知道它的工作原理。 – 2012-04-13 14:18:22
我不明白你在做什麼。您能否請張貼一些簡單的代碼,讓我們重現您的觀察? – moooeeeep 2012-04-13 14:26:47