各种exec 系列函数
各种 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 中搜索 lschar *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
)。