linux 子程式可以繼承父程式正在監聽的埠嗎? 如何子程式關閉了繼承的埠,父程式還能使用這個埠嗎?

ponponon發表於2023-05-09

在 Linux 中,子程式可以繼承父程式正在監聽的埠,這是因為子程式會繼承父程式開啟的檔案描述符,而監聽的套接字是透過檔案描述符來實現的。所以當子程式繼承父程式開啟的套接字時,也就繼承了這個套接字對應的檔案描述符,從而可以繼續監聽這個埠。

當子程式關閉繼承的埠時,父程式仍然可以使用這個埠。這是因為在 Linux 中,每個開啟的檔案都有一個引用計數。當一個程式關閉一個檔案時,核心會將檔案的引用計數減 1。只有當所有程式都關閉了這個檔案,引用計數才會降為 0,此時核心才會釋放檔案描述符和相應的資源。在我們這個例子中,當子程式關閉繼承的埠時,父程式仍然保持著對該埠的監聽,因此該埠的引用計數並不會降為 0,所以父程式仍然可以使用這個埠。

需要注意的是,當一個程式開啟一個埠並監聽它時,該埠會被標記為已被佔用。只有當該程式釋放了該埠,或者該程式退出時,該埠才會被標記為未被佔用。因此,如果子程式沒有在退出前關閉繼承的埠,即使父程式已經退出,該埠仍然會被標記為已被佔用,直到作業系統重新啟動或者手動釋放該埠。

相關文章