各种exec 系列函数

各种 exec 系列函数的区别

在类 UNIX 操作系统中,exec 系列函数用于用一个新程序替换当前进程。它们的主要区别在于参数传递方式、环境变量传递方式,以及是否在 PATH 中搜

详细说明

1. 参数传递方式

  • 可变参数(l 类型)
    execlexeclpexecle 接受一系列以 NULL 结尾的参数列表,调用时需显式写出各个参数。

  • 向量参数(v 类型)
    execvexecvpexecve 接受一个 argv 数组,将所有参数放入数组后统一传入,更适合参数数量动态的场景。

2. 环境变量

  • 继承环境
    所有不带 e(environment)后缀的函数(execlexeclpexecvexecvp)默认继承当前进程的环境变量 environ

  • 指定环境
    带 e 后缀的函数(execleexecve)允许通过额外的 envp 参数显式传入一个新的环境变量数组。

3. PATH 搜索

  • 不搜索
    指定完整路径时使用:execlexecleexecvexecve。第一个参数需给出可执行文件的绝对或相对路径。

  • 搜索 PATH
    只需给出文件名时使用:execlpexecvp。系统会遍历环境变量 PATH 中的各目录,找到第一个匹配的可执行文件。

使用示例


// execl 示例:直接执行 /bin/ls 
execl("/bin/ls", "ls", "-l", "/home", (char *)NULL); 

// execvp 示例:从 PATH 中搜索 ls
 char *args[] = { "ls", "-l", "/home", NULL }; 
execvp("ls", args); 

// execle 示例:执行,并传入自定义环境 
char *env[] = { "PATH=/usr/bin", "HOME=/root", NULL }; 
execle("/usr/bin/env", "env", NULL, env); 

// execve 示例:等价于 execle,但参数形式为向量 
char *args2[] = { "env", NULL }; char *env2[] = { "PATH=/usr/bin", NULL }; execve("/usr/bin/env", args2, env2);

总结

  • 若需列出参数继承环境,用 execl/execv

  • 若需列出参数自定义环境,用 execle

  • 若需向量参数继承环境,用 execv

  • 若需向量参数自定义环境,用 execve

  • 若需要按名字搜索可执行文件,在上述对应函数后加 p(即 execlp/execvp)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值