当我尝试覆盖当前启动的二进制文件时,覆盖失败,但之后cp
可以覆盖。例如:rm
cp
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 引用正在使用的文件,因此它们具有相同的文件名并不重要 - 它仍然是老的系统会一直打开这个文件,尽管它不再有链接,但只有当所有程序都关闭它时,它才会被删除。