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