替换原理
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。
如上图所示,我们使用exec系列函数后,会将物理内存的数据段和代码段进行替换,而我们的PCB(进程结构体)大致上是不会改变的。
exec系列函数
我们可以使用以下指令来查到exec系列函数的相关信息。
如上图所示,我们发现它有6种类型。其实我只要讲两种基本的,其它的就很好理解了。
我就细讲execl和execv两种。
execl
我们来看看它的参数,第一个参数的意思是你要写一个路径让它知道在哪里,第二个即后面的参数的意思就是你要替换的指令。(如图)
ls指令是在/usr/bin/ls下,后面就是我们想替换的指令,最后面的NULL的意思就是告诉它我们的指令输完了,可以停止读取了的意思。
我们可以来看看结果。
我们可以发现运行这个程序后出现的不是helloworld而是ls指令的结果,说明程序替换成功了。
execv
execv就是只要我们把分开写的指令写到一起就可以了。
如上图所示没有太大的区别。
那么其它的是什么意思呢?
那么有没有什么好的记法呢?其实是有的。
这些函数的返回值是什么意思呢?
注意:exec系列函数调用成功的时候是没有返回值的,只有调用失败的时候会返回-1.
所以如果我们想要进行程序替换的话,exec系列的函数可以帮助我们完成。