当我试图覆盖当前推出的二进制文件,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
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
use*_*686 43
在第一种情况下,您试图覆盖当前作为程序运行的文件的内容。Linux 不允许这样做——如果允许,你会在操作系统执行代码时覆盖它;第一个区别会使程序崩溃或使其出现故障。
但在第二种情况下,您实际上并没有更改旧文件的内容——您是在其位置创建一个新文件,而旧文件只是丢失了文件名但保持其内容不变。
(请记住,技术上rm不会删除文件,它只是删除目录链接 - 类似于向同一文件添加更多链接的方式。只有当文件没有链接且没有打开的文件引用时,它才会自动被删除。)ln
系统通过它们的 inode 引用正在使用的文件,所以它们具有相同的文件名并不重要——它仍然是系统保持打开的旧文件,即使它不再有链接,它也只会被删除一旦所有程序关闭它。
| 归档时间: |
|
| 查看次数: |
3214 次 |
| 最近记录: |