我是網絡編程的初學者..文件描述符父母和分叉兒童之間的共享
我遵循stevens並實現可靠的UDP服務器。
我有問題。
當一個孩子分叉什麼發生在父母套接字fd在孩子......?我讀他們得到繼承,這意味着我們有兩個套接字fd在父母和孩子的副本?我們是否需要關閉子代中的繼承父套接字fd(stevens代碼不這樣做)
如何在child中使用close()??關閉父fds但不是客戶端請求到達的套接字我應該保持這個開放)?
如果我很幼稚..請原諒我。
感謝您的幫助!
我是網絡編程的初學者..文件描述符父母和分叉兒童之間的共享
我遵循stevens並實現可靠的UDP服務器。
我有問題。
當一個孩子分叉什麼發生在父母套接字fd在孩子......?我讀他們得到繼承,這意味着我們有兩個套接字fd在父母和孩子的副本?我們是否需要關閉子代中的繼承父套接字fd(stevens代碼不這樣做)
如何在child中使用close()??關閉父fds但不是客戶端請求到達的套接字我應該保持這個開放)?
如果我很幼稚..請原諒我。
感謝您的幫助!
文件描述符在分叉時確實是「繼承的」,但僅限於它們連接的套接字,關閉文件描述符只會關閉套接字,如果它是與套接字(或文件,如果我們正在處理文件)。
你通常做的是你建立套接字,然後你叉。在父進程(fork返回非零的那個進程)中,你可以繼續並使用close(fd)
關閉文件描述符,如果你沒有,最終會在父進程中耗盡文件描述符。這適用於流(例如TCP)套接字,其中您有一個服務器套接字監聽連接,並且每個建立的連接有一個套接字。但是,您使用的是UDP,因此實際上只有一個套接字,如果您打算繼續在父進程中使用它,則需要弄清楚如何在父進程和子進程之間共享它。兩者都可以繼續使用它,但它幾乎是隨機的,誰讀取什麼,以什麼順序發送東西。在這種情況下,通常會有某種多路複用過程接收數據包,並根據某些消息內容將它們轉發給適當的子進程(根據某些其他機制,例如管道或其他套接字)(在TCP中,它是源IP /端口和目的IP /端口元組)。
馬特指出,用shutdown
將在事實上使插座無法使用(通常是不可寫的,但你可以指定這個)爲所有參與。在TCP,這可能會引發一個FIN包的發送,有效地發起連接的拆除,但您仍然能夠直到遠端確認FIN接收數據。