一:知识点
1.exec系列的方法,有6个(execl,execlp,execle,execv,execvp,execve)前5个是库函数,最后一个是系统调用, 这6个本质上没有什么区别,前5个的实现最后都是通过调用最后一个方法实现的
2.替换的时候PCB是不换的,只是把进程的实体替换掉了,然后PCB中的name改成了替换后的进程的名字,但是PCB的pid号是不变的
3.新进程的产生就是先复制再替换(fork+exec),进程就是这么得来的,没有直接创造新进程的方法
4.最好用的命令解释器:bash,命令解释器不只是有bash,还有很多(如:sh,tcsh),其中bash是最好用的命令解释器
5.命令就是我们通常说的可执行程序
6.bash先把自己复制一下,然后再替换成其他的可执行程序,所以就表现为新替换的程序的父进程是bash
7.6个替换的函数本质上没有什么区别,只是传入的参数不同,最后都会调用execve函数
8.每个函数其实都传了环境变量,只不过前两个省略了,在调用最后一个函数的时候,会把当前进程的环境传给新替换的程序
9.-f会显示父进程的id
10.内核外头围绕的就是命令解释器,通过命令解释器和内核沟通,用户在命令解释器之外
11.bash怎么帮我们执行命令呢?先把自己复制一下(fork),然后把复制出来的子进程替换成我们要执行的程序(exec)
二:替换的6个方法实现:
主函数的第一个参数:当前程序的名字,第二个参数:,第三个参数:
如果替换成功,就不会执行18行的printf(“exec error\n”);因为如果替换成功了,就从替换的哪个程序开始执行了,其实每个函数都需要传环境变量,只不过前面两个省略了,在调用最后一个函数的时候,会把当前进程的环境传给新替换的程序
1 #include <stdio.h