2010-10-17 65 views
4

我是網絡編程的初學者..文件描述符父母和分叉兒童之間的共享

我遵循stevens並實現可靠的UDP服務器。

我有問題。

當一個孩子分叉什麼發生在父母套接字fd在孩子......?我讀他們得到繼承,這意味着我們有兩個套接字fd在父母和孩子的副本?我們是否需要關閉子代中的繼承父套接字fd(stevens代碼不這樣做)

如何在child中使用close()??關閉父fds但不是客戶端請求到達的套接字我應該保持這個開放)?

如果我很幼稚..請原諒我。

感謝您的幫助!

回答

1

文件描述符在分叉時確實是「繼承的」,但僅限於它們連接的套接字,關閉文件描述符只會關閉套接字,如果它是與套接字(或文件,如果我們正在處理文件)。

你通常做的是你建立套接字,然後你叉。在父進程(fork返回非零的那個進程)中,你可以繼續並使用close(fd)關閉文件描述符,如果你沒有,最終會在父進程中耗盡文件描述符。這適用於流(例如TCP)套接字,其中您有一個服務器套接字監聽連接,並且每個建立的連接有一個套接字。但是,您使用的是UDP,因此實際上只有一個套接字,如果您打算繼續在父進程中使用它,則需要弄清楚如何在父進程和子進程之間共享它。兩者都可以繼續使用它,但它幾乎是隨機的,誰讀取什麼,以什麼順序發送東西。在這種情況下,通常會有某種多路複用過程接收數據包,並根據某些消息內容將它們轉發給適當的子進程(根據某些其他機制,例如管道或其他套接字)(在TCP中,它是源IP /端口和目的IP /端口元組)。

馬特指出,用shutdown將在事實上使插座無法使用(通常是不可寫的,但你可以指定這個)爲所有參與。在TCP,這可能會引發一個FIN包的發送,有效地發起連接的拆除,但您仍然能夠直到遠端確認FIN接收數據。