Linux下能不能替换运行中的程序

Linux下能不能替换运行中的程序,第1张

”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”。结果朋友发来一个执行结果:(test正在运行中)# cp test2 testcp: 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.*testopen("test2", O_RDONLY|O_LARGEFILE) = 3Linux由于Demand Paging机制的关系,必须确保正在运行中的程序镜像(注意,并非文件本身)不被意外修改,因此内核在启动程序后会锁定这个程序镜像的inode。这就是为什么cp在用“O_WRONLY|O_TRUNC”模式open目标文件时会失败。而先rm再cp的话,新文件的inode其实已经改变了,原inode并没有被真正删除,直到内核释放对它的引用。

程序命令输入更改已经运行程序的优先级。

#taskset:

-p,设定一个已存在的pid,而不是重新开启一个新任务

-c,指定一个处理,可以指定多个,以逗号分隔,也可指定范围,如:2,4,5,6-8。

切换某个进程到指定的cpu上:taskset-cp313290。让某程序运行在指定的cpu上:taskset-c1,2,4-7tarjcftest。tar。gztest。

需要注意的是,taskset-cp313290在设定一个已经存在的pid时,子进程并不会继承父进程的,因此像tarzcfxxx tar。gzxxx这样的命令,最好在启动时指定cpu,如果在已经启动的情况下,则需要指定tar调用的gzip进程。

优点:

1、Linux由众多微内核组成,其源代码完全开源。

2、Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/IPv4、TCP/IPv6和链路层拓扑程序等,且可以利用Unix的网络特性开发出新的协议栈。

3、Linux系统工具链完整,简单 *** 作就可以配置出合适的开发环境,可以简化开发过程,减少开发中仿真工具的障碍,使系统具有较强的移植性。

这个实现有点难度吧,按你的意思这个只在服务端运行,运行时是可以加载库的,但运行中这个库怎么切换到新的库,切换过程中怎么保护。而且动态链接库的加载时刻是什么时候,这个和动态库的实现、编译动态库时的选项以及 *** 作系统对动态库的处理都有关系。例如程序中用到的符号是在动态库加载时一次解析还是执行时用到再解析?动态库有没有初始化函数? *** 作系统是直接将动态库拷贝到内存(若需要)还是做 memory mapping 后通过 virtual memory 系统按需调入?这样考虑下来,加载时间是什么是相当不明确的事情。

建议看下《程序员的自我修养-链接,装载与库一书》,讲解的还是不错的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11700136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存