在linux上删除自身的可执行文件

在linux上删除自身的可执行文件,linux,command,Linux,Command,作为一个超级用户,我在linux上执行了以下命令 rm rm 它会自动移动。因为当进程在执行时,它的引用计数 不是零。因此无法删除它。所以我很困惑, 它是如何发生的,为什么会发生 我也用chown 0000 chown尝试了同样的方法 cp -r Dir1/ Dir2/ 在上面的命令中,当我仅在复制过程中删除源目录时会发生什么情况?这与临时文件相同 回想一下,创建一些临时文件的一种常用方法是创建一个文件(保留其文件描述符),然后(同时仍然有一个打开的文件描述符)。然后,只要进程正在运行并且没

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

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

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

cp -r Dir1/ Dir2/

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

这与临时文件相同

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

这是因为文件实际上不是目录中的文件名。(目录包含将名称与索引节点关联的条目)

内核管理一组“已使用”(或“已打开”)的索引节点,该集合包含由进程执行的索引节点(实际上,涉及某些地址映射的索引节点,如thru或

因此,在
/bin/rm/bin/rm
启动之后,内核有一个对
rm
二进制文件的引用作为进程的可执行文件

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


当然,您应该避免键入
/bin/rm/bin/rm
,但是您通常有一些独立的shell,如
sash
,以便能够修复您的系统。

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

在目录为空之前,不能使用rm删除目录