作者gn00618777 (非常念旧)
看板C_and_CPP
标题[问题] 有需要 close file descriptor 吗?
时间Mon Jul 26 20:55:03 2021
请问有需要在离开 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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1627304107.A.BE9.html
1F:推 Schottky: 看平台而定。如果你在写冷气机或遥控直升机的程式, 07/27 02:20
2F:→ Schottky: 有可能不会自动帮你 close fd 07/27 02:20
3F:→ Lipraxde: OS 在 process 结束回收资源的时候会帮你关吧,就像乱 07/27 08:20
4F:→ Lipraxde: 丢垃圾妈妈会帮忙收的感觉? 07/27 08:20
5F:推 CGS0: 保持好的习惯 ,会让你写大程式时 ,减少很多除错的时间 07/27 13:18
6F:推 cuteSquirrel: 最好养成有开有关的习惯 07/27 13:45
7F:推 Qbsuran: 那你觉得为什麽不用关 07/27 15:19
8F:推 d630200x: 养成习惯吧 07/28 00:04
9F:→ sunneo: 要关啊 假设今天把fd fileop 真正mapping到自动车跟车库 07/28 00:45
10F:→ sunneo: 车子跑一跑,车库没关,那就有差了 07/28 00:45
11F:推 b0920075: trace 了一下 linux 5.10.1 开启 regular file 会在 fs 07/28 01:46
12F:→ b0920075: /file_table.c 的 __alloc_file 用 kmem_cache_zalloc 07/28 01:46
13F:→ b0920075: 分配 object , kernel 的动态分配记忆体不确定有没有 07/28 01:46
14F:→ b0920075: 称为 heap 的惯例(usermode 下看 process memory maps 07/28 01:46
15F:→ b0920075: 是直接就写 heap , kernel 印象没看过这种说法?) 07/28 01:46
16F:推 b0920075: exit syscall 就会call filp_close 关档案引用减一,以 07/28 01:54
17F:→ b0920075: 上是 5.10.1 版本的 kernel 07/28 01:54
18F:→ b0920075: 如果是linux 然後 process 又是正常关掉 linux 是会帮 07/28 01:56
19F:→ b0920075: 你收好,但其他 os 就不好说了吧 07/28 01:56
20F:→ isaacting: 有些东西没有跑os的,不关会造成严重的错误 07/28 12:02
21F:→ isaacting: 我曾经在mcu上对sd卡读写,有api类似开关档,写了之後 07/28 12:03
22F:→ isaacting: 没有下关的指令,会让sd card读写造成错误 07/28 12:03
23F:推 Killercat: 通常关一关比较好 07/28 16:26
24F:推 pponywong: 同上面讲的 fd 不见得是档案 char kernel driver 都有 07/28 19:42
25F:→ pponywong: 可能用fd来操作 kernel driver不一定保证帮你处理 07/28 19:43
26F:→ pponywong: resource release的操作 我就遇过系统中直接发signal 07/28 19:44
27F:→ pponywong: 去砍掉程式 造成kernel panic的 07/28 19:44
28F:→ alex70266: 想不到什麽理由不关啦,更何况这是确保安全的习惯 07/28 23:11
29F:→ alex70266: 难道有了免治马桶以後就不用买卫生纸吗XD 07/28 23:12
30F:推 askacis: 不关fd, 则 process 会占用 一个 fd号码,系统跑久之後你 07/28 23:59
31F:→ askacis: 就会发现为什麽没办法开档了,因为系统的 fd都用光光了 07/28 23:59
32F:→ askacis: 很多系统灵异现象都是这样来的,记得用 lsof 查谁占住了 07/29 00:00
33F:→ askacis: 一堆 fd 07/29 00:00
34F:推 b0920075: 如果是 process 一直跑但是不关 fd 达到给 process 的 07/29 01:51
35F:→ b0920075: fd 上限後开下一个就会失败,但 fd 只跟 process 有关 07/29 01:51
36F:→ b0920075: 吧,跟系统上跑的其他 process 应该是独立不相干的? 07/29 01:51
37F:→ jacky1989: 建议保持好习惯,有fopen 就有fclose 07/30 00:37
38F:推 ibmibmibm: 如果你在写飞弹的程式,那可能发射两分钟後就有终极的 08/10 09:46
39F:→ ibmibmibm: 全系统资源回收,那就不用关了,不然还是都记得关吧 08/10 09:46
40F:推 youtuuube000: 问题是process很可能会长期跑啊..一直开着到时fd爆 08/12 14:43
41F:→ youtuuube000: 掉怎办 08/12 14:43
42F:推 ArdenCho: 关一关吧,养成一个好习惯 09/28 22:49