5

作为超级用户,我在 linux 上执行了以下命令

rm rm

会自行移除。因为当进程在执行时,它的引用计数不为零。因此它不能被删除。所以我很困惑,它是如何以及为什么会发生的?

我也尝试了同样的chown 0000 chown方法。

cp -r Dir1/ Dir2/

在上面的命令中,当我只在复制过程中删除源目录时会发生什么???

4

3 回答 3

2

它与临时文件相同。

回想一下,创建一些临时文件的常用方法是打开(2)一个文件(保留其文件描述符),然后取消链接(2)(同时仍然有一个打开的文件描述符)。然后,只要进程正在运行并且没有close(2) -d 该文件描述符,文件的数据就会保留在文件系统中。

这是因为文件实际上是inode ,而不是目录中的文件名。(目录包含将名称与 inode 相关联的条目)。

内核管理一组“已使用”(或“打开”)inode,并且该组包含由进程执行的 inode(实际上,涉及某些地址映射的 inode,例如通过mmap(2)execve(2)

因此,刚/bin/rm /bin/rm启动后,内核就会引用rm二进制文件作为进程的可执行文件。

当它处理unlink系统调用时,它暂时有两个引用(一个是正在执行的进程,另一个是/bin/rm传递给unlink内核实现的路径)并将其减少到一个。

当然你应该避免打字/bin/rm /bin/rm,但是你通常有一些独立的外壳sash来修复你的系统。

于 2013-08-10T19:12:33.567 回答
1

在 Windows 上,由于您提到的引用计数,“rm rm”可能是不可能的。然而,在大多数 *nix 系统上,它是。“rm”和“chmod”被加载到内存中,然后才会执行任何指定的命令行。另一个例子:在一个窗口中编辑一个文件,在编辑该文件时,在另一个窗口中将其删除。在大多数 *nix 系统上,这也应该是可能的,无论引用计数如何。

于 2013-08-11T03:40:18.430 回答
0

您不能使用 rm 删除目录,直到它为空..

于 2013-08-14T01:25:02.963 回答