当前位置: 技术问答>linux和unix
紧急求助:如何在应用程序运行的时候给程序打补丁?
来源: 互联网 发布时间:2016-09-12
本文导语: 环境:Linux AS5.0 开发语言:c/c++ 需求:在应用程序运行的时候,希望能够不停止应用程序,而对应用程序打补丁,从而改变应用程序的行为。 印象当中VxWorks系统是可以的,但是Linux下查了一天,没有找到。diff和patch...
环境:Linux AS5.0
开发语言:c/c++
需求:在应用程序运行的时候,希望能够不停止应用程序,而对应用程序打补丁,从而改变应用程序的行为。
印象当中VxWorks系统是可以的,但是Linux下查了一天,没有找到。diff和patch是对源代码打补丁的,实现不了这个功能。
那位高手用过,指点一下。谢谢!!!
开发语言:c/c++
需求:在应用程序运行的时候,希望能够不停止应用程序,而对应用程序打补丁,从而改变应用程序的行为。
印象当中VxWorks系统是可以的,但是Linux下查了一天,没有找到。diff和patch是对源代码打补丁的,实现不了这个功能。
那位高手用过,指点一下。谢谢!!!
|
用 dlopen, dlclose. 是可以实现动态加载和卸载动态库的。
但是动态更新模块对程序的设计要求比较高,简单点说就是要动态库提供的接口尽量简单,功能尽量独立,
当模块被卸载的时候, 主程序要能缓存 需要 被卸载模块去处理的数据。
但是动态更新模块对程序的设计要求比较高,简单点说就是要动态库提供的接口尽量简单,功能尽量独立,
当模块被卸载的时候, 主程序要能缓存 需要 被卸载模块去处理的数据。
|
我有一个思路, 就是利用动态库;补丁什么的,就是替换动态库,然后重新加载就行;比如,如查程序中用到libabc.so, 我替换掉libabc.so之后, 向程序发一个信息,告诉它有库更新了;它可以重新载入这个.要不用用dlopen?
|
所谓软件,包含几个部分:
1、二进制的执行代码,不包括动态库,也就是执行文件。执行后就装载到内存中,无法改变。
2、动态库,也就是.so文件,通过dlopen装载。这些文件可以动态替换,不过如果程序已经装载了该so文件,则必须通知(比如发信号)程序重新装载。
3、资源文件。如果程序已经打开,正在使用,则需要通知程序重新打开。否则直接替换即可。
如果补丁是针对源码的,你可以编译后,根据上面的原则替换对应文件,不过要保证编译参数跟运行中的版本一致。
另外,给进程发SIGCOUT信号也可以重启进程,不过进程同时也被打断了。
1、二进制的执行代码,不包括动态库,也就是执行文件。执行后就装载到内存中,无法改变。
2、动态库,也就是.so文件,通过dlopen装载。这些文件可以动态替换,不过如果程序已经装载了该so文件,则必须通知(比如发信号)程序重新装载。
3、资源文件。如果程序已经打开,正在使用,则需要通知程序重新打开。否则直接替换即可。
如果补丁是针对源码的,你可以编译后,根据上面的原则替换对应文件,不过要保证编译参数跟运行中的版本一致。
另外,给进程发SIGCOUT信号也可以重启进程,不过进程同时也被打断了。
|
动态库的加载也是在程序启动时就加载的,而不是在使用到函数的时候才去加载的,所以怕也无法实现楼主的要求的。
|
开发我不太会 但是我感觉这个可不可以 跟你程序自身的关系最大
印象当中VxWorks系统是可以的
------------------
你的印象是什么样的?
印象当中VxWorks系统是可以的
------------------
你的印象是什么样的?
|
对原代码打完补丁后,编译链接,然后重启应用程序就可以了。如果需要热替换,似乎还没有见到过。
|
太高深了
我在想 要是所有的系统 所有的软件都能很容易做成楼主说的那样
以后系统 软件升级打补丁 再也不用重启系统或者服务 那多好啊