设为首页 加入收藏

TOP

Linux下能不能替换运行中的程序
2014-11-23 23:31:46 来源: 作者: 【 】 浏览:4
Tags:Linux 不能 替换 运行 程序

今天被朋友问及“Linux下可以替换运行中的程序么?”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”。结果朋友发来一个执行结果:(test正在运行中)


# cp test2 test
cp: cannot create regular file `test': Text file busy


看起来是程序被占用,无法覆盖。于是自己又再做了几个实验:


(1)先rm删除正在运行的test,然后cp test2 test就没有错误了。


(2)先mv改名正在运行的test,然后cp test2 test也没有问题。


查了查资料并动手分析了一下,找到了比较满意的解释。cp并不改变目标文件的inode,事实上它的实现是这样的:


# strace cp test2 test 2>&1 | grep open.*test
open("test2", O_RDONLY|O_LARGEFILE) = 3
open("test", O_WRONLY|O_TRUNC|O_LARGEFILE) = 4



我原以为cp的实现是“rm + open(O_CREAT)”,不过现在想想上面的实现方式才是最可靠的(保证了时序安全和目标文件的属性)。这也可以解释为什么cp的目标文件会继承被覆盖文件的属性而非源文件。


Linux由于Demand Paging机制的关系,必须确保正在运行中的程序镜像(注意,并非文件本身)不被意外修改,因此内核在启动程序后会锁定这个程序镜像的inode。这就是为什么cp在用“O_WRONLY|O_TRUNC”模式open目标文件时会失败。而先rm再cp的话,新文件的inode其实已经改变了,原inode并没有被真正删除,直到内核释放对它的引用。同理,mv只是改变了文件名,其inode不变,新文件使用了新的inode。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇准备进行Linux设备驱动的开发了 下一篇Ubuntu调用函数分析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: