請問有需要在離開 process 時, close fd 嗎?
我想這大家一定都會說是。
開檔時, 核心分配一塊 file structure,fd 就是每個 process 內的 fd table
的索引,fd 就會指向某個文件的 inode。 當每一次指向(引用),就會引用+1
當完全沒process引用了此文件,記憶體就會被銷毀?
想請問
1 核心分配的 file structure 是 heap memory 嗎?
2 請問 process exit 時,引用會消失嗎? 如果引用會消失,那有必要還要 close(fd)?
感謝
看平台而定。如果你在寫冷氣機或遙控直升機的程式,有可能不會自動幫你 close fd
作者:
Lipraxde (Lipraxde)
2021-07-27 08:20:00OS 在 process 結束回收資源的時候會幫你關吧,就像亂丟垃圾媽媽會幫忙收的感覺?
作者:
CGS0 (Mike Chen)
2021-07-27 13:18:00保持好的習慣 ,會讓你寫大程式時 ,減少很多除錯的時間
作者:
Qbsuran (Qbsuran)
2021-07-27 15:19:00那你覺得為什麼不用關
作者:
sunneo (艾斯寇德)
2021-07-28 00:45:00要關啊 假設今天把fd fileop 真正mapping到自動車跟車庫車子跑一跑,車庫沒關,那就有差了
trace 了一下 linux 5.10.1 開啟 regular file 會在 fs/file_table.c 的 __alloc_file 用 kmem_cache_zalloc分配 object , kernel 的動態分配記憶體不確定有沒有稱為 heap 的慣例(usermode 下看 process memory maps是直接就寫 heap , kernel 印象沒看過這種說法?)exit syscall 就會call filp_close 關檔案引用減一,以上是 5.10.1 版本的 kernel如果是linux 然後 process 又是正常關掉 linux 是會幫你收好,但其他 os 就不好說了吧
有些東西沒有跑os的,不關會造成嚴重的錯誤我曾經在mcu上對sd卡讀寫,有api類似開關檔,寫了之後沒有下關的指令,會讓sd card讀寫造成錯誤
同上面講的 fd 不見得是檔案 char kernel driver 都有可能用fd來操作 kernel driver不一定保證幫你處理resource release的操作 我就遇過系統中直接發signal去砍掉程式 造成kernel panic的
作者: alex70266 (小眼) 2021-07-28 23:11:00
想不到什麼理由不關啦,更何況這是確保安全的習慣難道有了免治馬桶以後就不用買衛生紙嗎XD
作者:
askacis (ASKA)
2021-07-28 23:59:00不關fd, 則 process 會佔用 一個 fd號碼,系統跑久之後你就會發現為什麼沒辦法開檔了,因為系統的 fd都用光光了很多系統靈異現象都是這樣來的,記得用 lsof 查誰佔住了一堆 fd
如果是 process 一直跑但是不關 fd 達到給 process 的fd 上限後開下一個就會失敗,但 fd 只跟 process 有關吧,跟系統上跑的其他 process 應該是獨立不相干的?
作者:
ibmibmibm (BestSteve)
2021-08-10 09:46:00如果你在寫飛彈的程式,那可能發射兩分鐘後就有終極的全系統資源回收,那就不用關了,不然還是都記得關吧
問題是process很可能會長期跑啊..一直開著到時fd爆掉怎辦
作者: ArdenCho (Arden) 2021-09-28 22:49:00
關一關吧,養成一個好習慣