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