一、单进程下的程序替换
使用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实现的