cp 覆盖 vs rm 然后 cp

cp 覆盖 vs rm 然后 cp

当我尝试覆盖当前启动的二进制文件时,覆盖失败,但之后cp可以覆盖。例如:rmcp

user@poste:~$ cp binaryFile /tmp
user@poste:~$ sudo cp /tmp/binaryFile binaryFile 
[sudo] password for user:
cp: cannot create regular file `binaryFile`: Text file busy
user@poste:~$ sudo rm binaryFile 
user@poste:~$ sudo cp /tmp/binaryFile  binaryFile 
user@poste:~$ file binaryFile 
binaryFile : ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x7ce005d9eb50e2574246b6a881e625802f7e49f2, not stripped

知道为什么吗?

答案1

在第一种情况下,你试图覆盖文件的内容目前正在运行作为一个程序。Linux 不允许这样做 – 如果允许,您会在操作系统执行代码时覆盖代码;第一个差异会导致程序崩溃或出现故障。

但在第二种情况下,你实际上并没有改变旧文件的内容——你正在创建一个新的文件将替换原来的文件,而旧文件只是丢失了文件名,但内容保持不变。

(记住,这rm并不意味着技术上删除文件时,它只会删除目录链接——类似于向ln同一文件添加更多链接。只有当文件没有链接时没有打开的文件引用,它将被自动删除。)

系统通过 inode 引用正在使用的文件,因此它们具有相同的文件名并不重要 - 它仍然是老的系统会一直打开这个文件,尽管它不再有链接,但只有当所有程序都关闭它时,它才会被删除。

相关内容