c - 如何从Linux中的进程中分离可执行文件以进行实时更新
问题描述
通常,从该文件启动进程时,不能覆盖可执行文件。该进程可以随时尝试重新加载丢失的代码段。
是否有可能绕过/打破这个锁?
我的过程这样做了,mlockall()
所以所有代码页都已经加载了。
目标是流程(一个长期运行的任务)应该在尽可能少的停机时间内自我更新。
下载后,execl(argv[0],NULL)
应该激活更新的代码。
解决方案
对我来说,你在几个方面是错误的:
- 首先,您可以覆盖在 Linux 上运行的二进制文件(更具体地说,是文件存储在 ext{2,3,4} 文件系统上的二进制文件);原因很简单,只要在文件上仍然打开一个文件描述符,与该文件关联的 inode 就会由驱动程序保持“分配”,直到最后一个文件描述符在其上关闭,然后块被释放。因此不存在查找文件数据的风险。
- 代码在内存中映射是进程启动,因此不会丢失代码(并且由于 mmap 使用文件描述符,即使在惰性映射的情况下,整个文件仍然是“可映射的”。
- mlockall 用于锁定内存中的页面,从而防止交换,这与锁定文件系统上的文件关系不大。
最后,没有什么能阻止你做你所要求的。
推荐阅读
- amazon-web-services - Error using presigned URL for uploading data from Blazor WASM app to AWS S3 bucket
- database - 在数据库工作流程中查找产品的图像重复项
- python - python中Igraph图的边缘着色
- reactjs - Next.js 如何访问上传到公用文件夹的文件?
- python - 如何检查字符串中的下一项是否是前一项的字母后继?+ 逆
- python - 有没有办法改变 Python 中的 Windows 比例因子
- embedded - GPIOB 上的 EXTI 不起作用,但 GPIOA 上一切正常
- python - 最大年龄的出生日期的正则表达式
- javascript - 验证提交按钮取决于上传文件输入字段
- java - 获取特定字符串之后的所有不同单词