假設我們有一個打開的SocketChannel. 在終止應用程序之前明確關閉它是否重要?換句話說,如果我們不這樣做,是否有留下未關閉系統(tǒng)資源的風險?
2 回答

慕斯王
TA貢獻1864條經(jīng)驗 獲得超2個贊
假設您的操作系統(tǒng)是現(xiàn)代多用戶操作系統(tǒng),則不存在退出進程而不關閉通道、文檔、文件描述符的風險,這將使資源處于未關閉狀態(tài)。用戶空間進程擁有的所有資源在進程退出時由操作系統(tǒng)適當處理(即,如果需要,則關閉1)。
這適用于用戶進程是運行 Java 應用程序的 JVM 以及任何其他類型的用戶進程。
1 - 這比“一切都已關閉”要復雜一些。例如,在 UNIX/Linux 中,子進程可以從其父進程繼承打開的“文件”句柄,因此可以想象兩個或多個用戶進程可以共享一個網(wǎng)絡套接字。操作系統(tǒng)將使用引用計數(shù)處理這種情況。

侃侃爾雅
TA貢獻1801條經(jīng)驗 獲得超16個贊
當您的進程終止并且所有進程的資源將被釋放時,套接字將自動關閉。
但是如果這是一個 TCP 套接字,那么發(fā)生這種情況時一般不會通知另一端。就像有人拔掉了網(wǎng)線一樣。
如果您在同一臺機器上的進程之間進行通信,那么您可能希望改用管道,當您的一端自動關閉時,它會向另一端提供可靠的通知。
如果您想生成一個進程并在父進程宕機時讓它死掉,我建議為此使用一個未命名的管道到子進程 stdin。這是最簡單的事情,而且非??煽?。
添加回答
舉報
0/150
提交
取消