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