我第一個想到的是:可能ioctl可以檢查文件??上也洛e了,看了一下cp的源碼,原來如果一個文件正在運行,另一個進程再open以獲得寫權(quán)限的話,這個open本身就會失敗,返回-1,errno為ETXTBSY。
那么cp -f 為什么又可以?因為cp -f會先把目標(biāo)文件(要被覆蓋的文件)刪掉,然后將源文件rename為目標(biāo)文件名。
從內(nèi)核代碼看,當(dāng)運行一個二進制文件時
sys_execve()
do_execve()
open_exec()
deny_write_access()
這里的deny_write_access會把文件對應(yīng)inode的i_writecount成員減1,通常i_writecount的值就變成-1了(初始為0)
這時候再有進程想以寫模式open:
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會發(fā)現(xiàn)inode的i_writecount成員為負數(shù)了,所以直接返回 -ETXTBSY