[問題] 有需要 close file descriptor 嗎?

看板C_and_CPP作者 (非常念舊)時間2年前 (2021/07/26 20:55), 編輯推噓11(11026)
留言37則, 14人參與, 2年前最新討論串1/1
請問有需要在離開 process 時, close fd 嗎? 我想這大家一定都會說是。 開檔時, 核心分配一塊 file structure,fd 就是每個 process 內的 fd table 的索引,fd 就會指向某個文件的 inode。 當每一次指向(引用),就會引用+1 當完全沒process引用了此文件,記憶體就會被銷毀? 想請問 1 核心分配的 file structure 是 heap memory 嗎? 2 請問 process exit 時,引用會消失嗎? 如果引用會消失,那有必要還要 close(fd)? 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.72.6 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1627304107.A.BE9.html

07/27 02:20, 2年前 , 1F
看平台而定。如果你在寫冷氣機或遙控直升機的程式,
07/27 02:20, 1F

07/27 02:20, 2年前 , 2F
有可能不會自動幫你 close fd
07/27 02:20, 2F

07/27 08:20, 2年前 , 3F
OS 在 process 結束回收資源的時候會幫你關吧,就像亂
07/27 08:20, 3F

07/27 08:20, 2年前 , 4F
丟垃圾媽媽會幫忙收的感覺?
07/27 08:20, 4F

07/27 13:18, 2年前 , 5F
保持好的習慣 ,會讓你寫大程式時 ,減少很多除錯的時間
07/27 13:18, 5F

07/27 13:45, 2年前 , 6F
最好養成有開有關的習慣
07/27 13:45, 6F

07/27 15:19, 2年前 , 7F
那你覺得為什麼不用關
07/27 15:19, 7F

07/28 00:04, 2年前 , 8F
養成習慣吧
07/28 00:04, 8F

07/28 00:45, 2年前 , 9F
要關啊 假設今天把fd fileop 真正mapping到自動車跟車庫
07/28 00:45, 9F

07/28 00:45, 2年前 , 10F
車子跑一跑,車庫沒關,那就有差了
07/28 00:45, 10F

07/28 01:46, 2年前 , 11F
trace 了一下 linux 5.10.1 開啟 regular file 會在 fs
07/28 01:46, 11F

07/28 01:46, 2年前 , 12F
/file_table.c 的 __alloc_file 用 kmem_cache_zalloc
07/28 01:46, 12F

07/28 01:46, 2年前 , 13F
分配 object , kernel 的動態分配記憶體不確定有沒有
07/28 01:46, 13F

07/28 01:46, 2年前 , 14F
稱為 heap 的慣例(usermode 下看 process memory maps
07/28 01:46, 14F

07/28 01:46, 2年前 , 15F
是直接就寫 heap , kernel 印象沒看過這種說法?)
07/28 01:46, 15F

07/28 01:54, 2年前 , 16F
exit syscall 就會call filp_close 關檔案引用減一,以
07/28 01:54, 16F

07/28 01:54, 2年前 , 17F
上是 5.10.1 版本的 kernel
07/28 01:54, 17F

07/28 01:56, 2年前 , 18F
如果是linux 然後 process 又是正常關掉 linux 是會幫
07/28 01:56, 18F

07/28 01:56, 2年前 , 19F
你收好,但其他 os 就不好說了吧
07/28 01:56, 19F

07/28 12:02, 2年前 , 20F
有些東西沒有跑os的,不關會造成嚴重的錯誤
07/28 12:02, 20F

07/28 12:03, 2年前 , 21F
我曾經在mcu上對sd卡讀寫,有api類似開關檔,寫了之後
07/28 12:03, 21F

07/28 12:03, 2年前 , 22F
沒有下關的指令,會讓sd card讀寫造成錯誤
07/28 12:03, 22F

07/28 16:26, 2年前 , 23F
通常關一關比較好
07/28 16:26, 23F

07/28 19:42, 2年前 , 24F
同上面講的 fd 不見得是檔案 char kernel driver 都有
07/28 19:42, 24F

07/28 19:43, 2年前 , 25F
可能用fd來操作 kernel driver不一定保證幫你處理
07/28 19:43, 25F

07/28 19:44, 2年前 , 26F
resource release的操作 我就遇過系統中直接發signal
07/28 19:44, 26F

07/28 19:44, 2年前 , 27F
去砍掉程式 造成kernel panic的
07/28 19:44, 27F

07/28 23:11, 2年前 , 28F
想不到什麼理由不關啦,更何況這是確保安全的習慣
07/28 23:11, 28F

07/28 23:12, 2年前 , 29F
難道有了免治馬桶以後就不用買衛生紙嗎XD
07/28 23:12, 29F

07/28 23:59, 2年前 , 30F
不關fd, 則 process 會佔用 一個 fd號碼,系統跑久之後你
07/28 23:59, 30F

07/28 23:59, 2年前 , 31F
就會發現為什麼沒辦法開檔了,因為系統的 fd都用光光了
07/28 23:59, 31F

07/29 00:00, 2年前 , 32F
很多系統靈異現象都是這樣來的,記得用 lsof 查誰佔住了
07/29 00:00, 32F

07/29 00:00, 2年前 , 33F
一堆 fd
07/29 00:00, 33F

07/29 01:51, 2年前 , 34F
如果是 process 一直跑但是不關 fd 達到給 process 的
07/29 01:51, 34F

07/29 01:51, 2年前 , 35F
fd 上限後開下一個就會失敗,但 fd 只跟 process 有關
07/29 01:51, 35F

07/29 01:51, 2年前 , 36F
吧,跟系統上跑的其他 process 應該是獨立不相干的?
07/29 01:51, 36F

07/30 00:37, 2年前 , 37F
建議保持好習慣,有fopen 就有fclose
07/30 00:37, 37F
文章代碼(AID): #1W_h2hlf (C_and_CPP)