2014-01-17 30 views
0

我有一個父進程,它監聽套接字上的傳入連接,並在接受客戶端之後,它將關聯的文件描述符和其他日期傳遞給子節點(通過一個named管)。孩子在分支後寫在父親創建的文件描述符

從這一刻起,子進程將爲客戶提供服務,並且父進程不斷監聽新客戶。

我的問題是,當我嘗試在子進程中的文件描述符上寫入時,我將得到一個錯誤(錯誤的文件描述符)並且寫入失敗。我的猜測是,因爲這些文件描述符是在fork之後創建的,所以child不能簡單地使用它們,它們只屬於父進程。

那麼這是寫入失敗的原因嗎?有沒有任何可能的方法讓孩子使用這些文件描述符?



正如在由loreb答案所提到的,這是不可能實現以這種方式所期望的結果。我通過使用另一個管道將孩子的迴應指向父母做了臨時修復。由於文件描述符屬於父節點,它可以通過套接字將響應轉發回客戶端。

+0

爲什麼不在父進程中創建套接字,以便父文件和子文件之間共享文件描述符.. –

+0

@Abhiteshkhatri,因爲我的客戶端在fork之後將繼續連接並且在fork之後創建文件描述符父母和孩子。 – mdoust

+0

你可以在fork之前創建一個共享內存,並在共享內存上保留文件描述符(我懷疑如何將文件描述符放在共享內存上)。如果是這樣,那麼你的描述符將在子和父之間共享。 –

回答

0

要傳遞文件描述符,你需要AF_UNIX套接字,而不是命名管道。 你需要sendmsg(3),這是非常奇怪的使用,所以你最好在網上查找一些例子 - 例如libowfat中的io_passfd。

編輯:萬一有人絆倒在這個答案,不要使用AF_UNIX客戶端/服務器,使用socketpair(2)

+0

感謝您的回覆。所以根據你的回答,傳遞文件描述符並不像將整數值傳遞給child那麼簡單。對於我正在處理的這個任務,無法使用sendmsg()系統調用。我想我必須在這裏做一些重新設計。再次感謝。 – mdoust

+0

對,這並不那麼簡單;如果你對細節感興趣,在右邊的「相關」部分有一些很好的解釋。 – loreb

0

也許你應該嘗試關閉和FD的重啓。

+0

文件描述符屬於一個活動的套接字連接,所以我想這不像在父文件中關閉它並在子文件中重新打開它那麼簡單。 – mdoust