如果 so 文件突然用 rm 删除,而相关进程还保持着 inode 的引用的情况下,还能正常运行多久?

2018-07-16 11:56:25 +08:00
 AllOfMe

比如说 /lib64 下的 so 文件,一下子被删除掉,尽管命令行用不了,也创建不了新进程,但是我发现原有的进程还能正常运行。经过 google,好象是 rm 并不能真正的删除掉数据,只有当进程不用了才会回收持有的 inode 再去引用新的 inode。
所以我比较好奇,这个 rm 到引用新的 inode 这段时间里进程是否能正常工作?还有这段时间内 什么情况下会释放 inode ?如果释放 inode 引用之后再去找新 inode 找不到会直接崩溃吗?
欢迎大家讨论一下^_^li

4209 次点击
所在节点    Linux
12 条回复
lolizeppelin
2018-07-16 11:57:38 +08:00
可以一直用 你可以从 proc 里把文件复制出来
lolizeppelin
2018-07-16 11:58:35 +08:00
原理和 gc 引用计数器差不多吧 没引用了就回收
yuedingwangji
2018-07-16 13:18:09 +08:00
@lolizeppelin 请问怎么拷贝
hjc4869
2018-07-16 14:22:19 +08:00
如果是 elf 导入的 dll 那么直到进程结束用的都是这个文件。如果是 dlopen,那么 dlclose 后可能会释放。看具体实现。
hjc4869
2018-07-16 14:25:30 +08:00
例如 glibc 在 dlclose 引用计数到 0 时会关闭文件,但是 musl 不会。
iwtbauh
2018-07-16 17:56:34 +08:00
i_count 与 i_nlink 的区别
现在知道为什么 Unix 操作系统上删除文件的系统调用叫 unlink 不叫 deletefile 了吧
AllOfMe
2018-07-16 18:12:22 +08:00
@yuedingwangji 应该可以用 busybox,简单的 mv 和 cp 操作
q397064399
2018-07-16 18:12:56 +08:00
/proc/PID/maps
sampeng
2018-07-16 23:12:53 +08:00
看他什么时候饿死…唔
tempdban
2018-07-17 01:32:04 +08:00
@hjc4869 学到了 musl,看了资料这东西猛的一逼。
msg7086
2018-07-17 02:22:18 +08:00
程序在运行的时候,打开了文件句柄,所以文件是一直可用的。
你删除文件,并不是删除的文件,而是删除的文件系统中对于文件的引用。
文件一直在那,只不过 unlink 以后在任何目录中都没有对于这个文件的引用了而已。
所以程序会正常运行一直到结束。

unlink 以后影响的是下一个启动的程序,因为程序启动时依赖文件系统中的引用,而引用已经被删除了,所以新程序会无法启动。

> 找 inode

程序是不会去找 inode 的,只会找文件路径,所以是程序启动那一刻,文件路径所指向的文件。之后被删除了,又被新建了,都没关系。
PythonAnswer
2018-07-17 14:22:13 +08:00
感谢楼上

顺便问下,为什么叫句柄?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/471265

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX