1. exec函数族介绍
fork()函数可以用来创建子进程,但是子进程执行的是和父进程相同的程序,或者说执行父进程程序的一部分,或者父进程与子进程执行不同的代码分支,但总归是跟父进程关系很大的程序。但我们创建子进程的目的往往是要让进程执行新的程序才行,这个时候就需要用到exec函数族。
当进程调用一种exec函数时,该进程用户空间的代码和数据会被新程序完全替代,然后从新程序的第一行代码开始执行,中间只要不出现错误就不会返回到原程序的代码,如果出现错误则返回到原程序中调用exec函数的下一行继续执行。
exec函数族并没有新建进程,因此进程的pid不变,它只是将原先进程的代码段数据段都替换成新进程的了
主要掌握excel和excelp即可
2. execl
函数原型如下
第一个参数path是要执行的新的程序(程序就是编译好的二进制代码)的路径
第二个参数arg是一个参数列表,即要执行的程序本身名字以及需要的实参
参数列表以NULL或者nullptr结尾,表示参数到此为止,后边没有了
如下边例子,第一个参数是ls这个命令(可执行程序)的路径,第二个参数是函数名,后边两个是参数
注意exec函数一旦执行成功就不会返回原函数,因为进程中原函数代码段已经被替换掉了,所以上方字符串“回来了吗”并没有输出
但是如果exec函数失败了的话,还是会继续执行原函数接下来的代码,此时没有进程替换,原函数代码还在
如下,此时找不到命令ls,因为当前程序所在目录中没有ls,于是“回到了吗”输出了
3. execlp
execlp与execl的区别就在于可以借助环境变量PATH来找到想要执行的可执行程序
即这里第一个参数ls可以不用指名路径 “/bin/ls”
4. fork与exec使用案例
打开一个bash,即有一个bash进程,如果我们要在这个bash里运行ls指令,则bash先调用fork创建也给子进程,然后这个子进程调用exec来执行ls