欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

linux使用cp報錯 Text file busy

  發(fā)布時間:2014-04-12 22:19:36   作者:佚名   我要評論
有同事問到我:使用cp命令時,如果發(fā)現(xiàn)要被覆蓋的文件(二進制可執(zhí)行文件)正在運行,cp會報錯,cp命令是怎么知道該文件正在執(zhí)行的?

我第一個想到的是:可能ioctl可以檢查文件??上也洛e了,看了一下cp的源碼,原來如果一個文件正在運行,另一個進程再open以獲得寫權(quán)限的話,這個open本身就會失敗,返回-1,errno為ETXTBSY。

那么cp -f 為什么又可以?因為cp -f會先把目標文件(要被覆蓋的文件)刪掉,然后將源文件rename為目標文件名。

從內(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

相關(guān)文章

最新評論