Linux使用CP报告错误的文本文件。
我想到的第一件事就是ioctl可以检查文件。不幸的是,我猜错了。我看了看源代码,原来,如果一个文件正在运行另一个过程又是开放的,为了获得写权限,开放本身将失败并返回1,错误是etxtbsy。
那么为什么F - F可以恢复正常呢因为CP - F会首先删除目标文件(要覆盖的文件),然后将源文件重命名为目标文件名。
在运行二进制文件时,从内核代码
sys_execve()
do_execve()
open_exec()
deny_write_access()
这里的deny_write_access减小文件的inode的i_writecount成员1,对i_writecount值变为1(初始0)。
此时,进程希望打开模式:
do_sys_open()
do_filp_open()
path_openat()
do_last()
nameidata_to_filp()
__dentry_open()
__get_file_write_access()
get_write_access()
get_write_access会发现inode的i_writecount成员是消极的,所以他们直接返回到etxtbsy