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