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

详细说明
1. 参数传递方式
-
可变参数(l 类型)
execl、execlp、execle接受一系列以NULL结尾的参数列表,调用时需显式写出各个参数。 -
向量参数(v 类型)
execv、execvp、execve接受一个argv数组,将所有参数放入数组后统一传入,更适合参数数量动态的场景。
2. 环境变量
-
继承环境
所有不带e(environment)后缀的函数(execl、execlp、execv、execvp)默认继承当前进程的环境变量environ。 -
指定环境
带e后缀的函数(execle、execve)允许通过额外的envp参数显式传入一个新的环境变量数组。
3. PATH 搜索
-
不搜索
指定完整路径时使用:execl、execle、execv、execve。第一个参数需给出可执行文件的绝对或相对路径。 -
搜索 PATH
只需给出文件名时使用:execlp、execvp。系统会遍历环境变量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)。

2132

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



