本篇文章為大家展示了如何解決linux使用cp報(bào)錯(cuò),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
專注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)睢寧縣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
我第一個(gè)想到的是:可能ioctl可以檢查文件??上也洛e(cuò)了,看了一下cp的源碼,原來(lái)如果一個(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ì)把文件對(duì)應(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
上述內(nèi)容就是如何解決linux使用cp報(bào)錯(cuò),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。