cp报错"Text file busy"

有同事问到我:使用cp命令时,如果发现要被覆盖的文件(二进制可执行文件)正在运行,cp会报错,cp命令是怎么知道该文件正在执行的?

我第一个想到的是:可能ioctl可以检查文件。可惜我猜错了,看了一下cp的源码,原来如果一个文件正在运行,另一个进程再open以获得写权限的话,这个open本身就会失败,返回-1,errno为ETXTBSY。
那么cp -f 为什么又可以?因为cp -f会先把目标文件(要被覆盖的文件)删掉,然后将源文件rename为目标文件名。

从内核代码看,当运行一个二进制文件时
sys_execve()
  do_execve()
    open_exec()
      deny_write_access()
这里的deny_write_access会把文件对应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会发现inode的i_writecount成员为负数了,所以直接返回 -ETXTBSY


相关文章

分类

留言:

关于文章

This page contains a single entry by DongHao published on 05 12, 2011 5:32 PM.

ioctl的性能瓶颈 was the previous entry in this blog.

捉虫记 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.