比如说 /lib64 下的 so 文件,一下子被删除掉,尽管命令行用不了,也创建不了新进程,但是我发现原有的进程还能正常运行。经过 google,好象是 rm 并不能真正的删除掉数据,只有当进程不用了才会回收持有的 inode 再去引用新的 inode。
所以我比较好奇,这个 rm 到引用新的 inode 这段时间里进程是否能正常工作?还有这段时间内 什么情况下会释放 inode ?如果释放 inode 引用之后再去找新 inode 找不到会直接崩溃吗?
欢迎大家讨论一下^_^li
1
lolizeppelin 2018-07-16 11:57:38 +08:00 via Android 1
可以一直用 你可以从 proc 里把文件复制出来
|
2
lolizeppelin 2018-07-16 11:58:35 +08:00 via Android 1
原理和 gc 引用计数器差不多吧 没引用了就回收
|
3
yuedingwangji 2018-07-16 13:18:09 +08:00 via Android
@lolizeppelin 请问怎么拷贝
|
4
hjc4869 2018-07-16 14:22:19 +08:00 1
如果是 elf 导入的 dll 那么直到进程结束用的都是这个文件。如果是 dlopen,那么 dlclose 后可能会释放。看具体实现。
|
5
hjc4869 2018-07-16 14:25:30 +08:00 2
例如 glibc 在 dlclose 引用计数到 0 时会关闭文件,但是 musl 不会。
|
6
iwtbauh 2018-07-16 17:56:34 +08:00 via Android 1
i_count 与 i_nlink 的区别
现在知道为什么 Unix 操作系统上删除文件的系统调用叫 unlink 不叫 deletefile 了吧 |
7
AllOfMe OP @yuedingwangji 应该可以用 busybox,简单的 mv 和 cp 操作
|
8
q397064399 2018-07-16 18:12:56 +08:00 1
/proc/PID/maps
|
9
sampeng 2018-07-16 23:12:53 +08:00 via iPhone
看他什么时候饿死…唔
|
11
msg7086 2018-07-17 02:22:18 +08:00 1
程序在运行的时候,打开了文件句柄,所以文件是一直可用的。
你删除文件,并不是删除的文件,而是删除的文件系统中对于文件的引用。 文件一直在那,只不过 unlink 以后在任何目录中都没有对于这个文件的引用了而已。 所以程序会正常运行一直到结束。 unlink 以后影响的是下一个启动的程序,因为程序启动时依赖文件系统中的引用,而引用已经被删除了,所以新程序会无法启动。 > 找 inode 程序是不会去找 inode 的,只会找文件路径,所以是程序启动那一刻,文件路径所指向的文件。之后被删除了,又被新建了,都没关系。 |
12
PythonAnswer 2018-07-17 14:22:13 +08:00 via Android
感谢楼上
顺便问下,为什么叫句柄? |