Linux进程程序替换

本文详细介绍了单进程和多进程环境下使用execl进行程序替换的原理,包括代码执行的内存替换过程、父子进程继承特性以及exec系列函数(如execl、execlp、execv、execle)的使用方法。还探讨了环境变量在exec中的作用和系统调用execve的关系。
摘要由CSDN通过智能技术生成

一、单进程下的程序替换

使用execl进行程序替换,先执行execl前面的代码,在execl处替换成其它进程的代码和数据继续执行,后面的内容就不执行了,因此只打印before

二、程序替换原理

前面我们fork创建子进程,子进程会继承父进程的代码和数据,通过pid_t id进行分流。

而使用execl进行程序替换,可以使子进程执行外部其它写好的程序。

执行到execl时,直接将新的代码和数据替换到物理内存上,然后调整页表映射关系;这一过程中PCB不变,还是原来的进程。

注:父子进程继承时,一般只有数据是写时拷贝,代码为只读。

程序替换因为要修改只读的代码区,OS内部就会进行写时拷贝,这是为了保持进程独立性。

三、多进程版

创建一个子进程进行execl程序替换,替换后子进程不变,退出后被父进程wait回收

execl成功没有返回值,失败有返回值,代码和数据不被替换,继续执行,父进程根据退出码可以得到相应execl失败的信息。

四、exec系列函数接口的使用

注意几点规律:

1、execl

第一个为路径(相对或绝对均可,即找到这个可执行程序)   

带l(list)为可变参数列表,参数一个接一个传入。和命令行一样,指令+选项(找到后怎样做)

2、execlp(PATH) 

会在默认的PATH环境变量中查找(可以省略一些路径)

注:环境变量是全局的,一直被继承,替换时不改变环境变量

3、execv(vector)

参数类型为 字符串指针数组

将myargv这个命令行参数的数组,传递给前面路径程序的int  main(....)

传参在函数栈帧角度就是压栈出栈等一系列操作.....

4、execle(env)

可以传入自己的环境变量env

makefile伪目标(一次make,生成多个可执行程序)

小问题:

exec可以执行系统命令,也可以执行自己写的可执行程序。

“  ”内就是可执行程序的名字,找到路径,直接执行。

exec可以跨语言调用

回到execle:

命令行参数和环境变量也是数据,在进程地址空间中存在,只要不w,就是全局的,一直继承下去

execl中,不传环境变量参数,替换过来的函数也能拿到。

5、系统调用execve

之前的6个函数底层都是通过调用execve实现的

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值