【Linux】进程程序替换
目录
单进程版的程序替换
程序替换的原理
把自己的代码和数据替换成其他的代码和数据,然后再执行一遍新的代码。进程的内核数据结构不变。
多进程版的程序替换
子进程进行程序替换不会影响父进程,
数据可以触发写时拷贝,但是代码不可被写入,怎么办?事实上代码也可以触发写时拷贝,不过不能自己写,而是系统写。
程序替换没有创建新进程,只进行进程的代码和数据的替换。
替换原理
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。
程序替换后,替换函数后面的代码不会执行。
替换失败就继续执行后面的代码。
所以替换函数只有失败返回值没有成功返回值。
CPU如何知道程序的入口地址?
linux形成的可执行程序是elf格式,这种格式最开始有可执行程序的表头,可执行程序的入口地址就在表里面。
替换函数
这些是库函数
这个是系统调用
execl
函数名都有exec,l可以理解为list,表示第二个参数开始是一个一个的可变参数,和命令行参数一样。
execl第一个参数是找到这个程序的位置,后面的参数是如何执行这个程序。
execlp
execlp,p表示会默认在PATH环境变量中查找,所以你不用给我路径,直接给我文件名就行。
execv
execv,v可以理解为vector,第二个参数是一个字符串指针数组。
execvp
execvp,写程序名就行,路径会在PATH环境变量里面找。
execle
程序替换后,环境变量信息不会被替换。
在父进程里面putenv,新增的环境变量会继承给子进程。
execle,可以自定义环境变量表
把系统的环境变量表给新的程序
自定义环境变量表,这里会覆盖原本的环境变量表。
函数解释
命名理解
原文地址:https://blog.csdn.net/m0_71164215/article/details/143864770
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!