进程(六)—— 进程程序替换(exec函数族)

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

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

exec 函数族的作用是替换原本要执行程序,转而去执行其他程序,可以让我们更加灵活的给子进程分配任务。 


目录

一、exec函数族

1、execl / execlp

(1) execl函数参数解析

(2) execlp 函数参数解析

2、execv / execvp / execvpe

(1) execv函数参数解析

(2) execvp函数参数解析

(3) execvpe函数参数解析

二、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值