fork创建子进程以后,子进程继承父进程的一部分代码和数据,如果我们希望子进程和父进程执行不同的代码,我们可以通过判断 fork函数 的返回值来判断当前进程是父进程还是子进程,进而分配不同的任务。

exec 函数族的作用是替换原本要执行程序,转而去执行其他程序,可以让我们更加灵活的给子进程分配任务。
目录
一、exec函数族
exec函数族的命名存在规律性,exec之后的字母代表了当前函数传递参数的类型。
- “l”:表示list,传递的是形参列表;
- “v”:表示vector,传递的是形参数组;
- “p”:表示path,说明当前函数会去环境变量中搜索替换程序文件;
- “e”:表示environment,说明当前函数搜索替换程序程序时,搜索的是自定义环境变量。
1、execl / execlp
execl 和 execlp函数的声明如下:

(1) execl函数参数解析
execl函数是去指定路径下面搜索并执行相应的程序。execl 的最后一个参数必须是NULL
- 参数 path:替换程序所在路径。(如果是自己编写的替换程序,替换程序必须包含main函数)
- 参数arg:传递给替换程序的参数。arg 会被传递给替换程序 main 函数的 argv,main函数中的 argv 根据NULL来判断参数是否传递结束。
// argc —— 接收到的外部参数的个数
// argv —— 接收到的外部参数的内容
int main(int argc, char** argv){}
- 返回值:调用失败返回 -1,errno 会被设置(可以根据错误码对应到错误信息)
// execl
const char* path = "/bin/ls";
if(execl(path, "ls", "-a", "-l", NULL)<0){ // execl 最后一个参数必须是NULL
perror("execl");
}
(2) execlp 函数参数解析
execlp函数是去当前Shell 的环境变量PATH中搜索并执行相应的程序。execlp 的最后一个参数必须是NULL

本文深入探讨了在Unix/Linux系统中,如何通过fork创建子进程,并利用exec函数族进行进程程序替换,实现子进程执行不同代码。exec函数包括execl、execlp、execv、execvp和execvpe,它们在参数传递和搜索路径上有不同特点。这些函数允许程序在不创建新进程的情况下执行其他程序,广泛应用于进程间的任务切换和执行不同任务的场景。
最低0.47元/天 解锁文章
617

被折叠的 条评论
为什么被折叠?



