【发布时间】:2013-08-10 17:49:31
【问题描述】:
作为超级用户,我在linux上执行了以下命令
rm rm
会自行移除。因为当进程在执行时,它的引用计数 不为零。因此无法删除。所以我很困惑, 它是如何以及为什么会发生的?
我也对chown 0000 chown 进行了同样的尝试。
cp -r Dir1/ Dir2/
在上面的命令中,当我只在复制过程中删除源目录时会发生什么???
【问题讨论】:
作为超级用户,我在linux上执行了以下命令
rm rm
会自行移除。因为当进程在执行时,它的引用计数 不为零。因此无法删除。所以我很困惑, 它是如何以及为什么会发生的?
我也对chown 0000 chown 进行了同样的尝试。
cp -r Dir1/ Dir2/
在上面的命令中,当我只在复制过程中删除源目录时会发生什么???
【问题讨论】:
与临时文件相同。
回想一下,创建一些临时文件的常用方法是 open(2) 一个文件(保留其文件描述符),然后 unlink(2) (同时仍然有一个打开的文件描述符)。那么文件的数据只要进程在运行并且没有close(2)-d那个文件描述符就一直留在文件系统中。
这是因为文件确实是inodes - 而不是目录中的文件名。 (目录包含将名称与 inode 相关联的条目)。
内核管理一组“已使用”(或“打开”)inode,该组包含由进程执行的inode(实际上,涉及一些地址映射的inode,如mmap(2)或execve(2))
所以就在/bin/rm /bin/rm 启动之后,内核有一个对rm 二进制文件的引用作为进程的可执行文件。
当它处理unlink 系统调用时,它暂时有两个引用(一个是正在执行的进程,另一个是路径/bin/rm 传递给unlink 内核实现)并将其减少到一个。
当然你应该避免输入/bin/rm /bin/rm,但是你通常有一些像sash这样的独立shell来修复你的系统。
【讨论】:
在 Windows 上,由于您提到的引用计数,“rm rm”可能是不可能的。然而,在大多数 *nix 系统上,它是。 “rm”和“chmod”被加载到内存中,然后才会执行任何指定的命令行。另一个例子:在一个窗口中编辑一个文件,在编辑该文件时,在另一个窗口中将其删除。在大多数 *nix 系统上,这也应该是可能的,无论引用计数如何。
【讨论】:
你不能使用 rm 删除一个目录,直到它为空..
【讨论】: