UNIX编程-exec函数

Posted by 周思进 on February 11, 2022

在父进程中要起一个新程序执行,常规操作都是先 fork 一个子进程,在子进程中调用 exec 函数启动新的进程。

exec 函数有多钟 API 选择,除了系统调用 execve(), 还有均构建于 execve() 调用之上的库函数(execl、execle、execlp、execv、execvp)。

这几个函数如果不常用,基本每次都要查下手册看下,下面简单做下记录。


一、execve

int execve(const char *path, char *const argv[], char *const envp[]);

path 指向要执行的程序的路径名,可以是绝对路径,也可以是相对于调用进程当前工作目录的相对路径。

argv 类似于 main 函数的第二个入参,以NULL结尾的字符串数组,其中argv[0]对应于程序名称,也即 path 路径名的最后部分。

envp 指定新程序的环境列表。


二、exec相关库函数

int execl(const char *path, const char *arg0, ... /*, (char *)NULL */);

int execle(const char *path, const char *arg0, ...
         /*, (char *)NULL, char *const envp[] */);

int execlp(const char *file, const char *arg0, ... /*, (char *)NUL */);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

上述这些库函数都构建于 execve 系统调用之上,只是在指定程序、参数及环境变量上有所差异; 具体差异可以从函数命名中进行区分。

如函数命名中带字母 p 的,则表示程序会从系统 PATH 环境变量中去查找,只需指出要执行的程序名称即可;当然也可以带路径传递,这样就不会从系统 PATH 环境变量中去查找了。

如函数命名中带字母 l 的,则表示指定的参数不以 argv 数组形式提供,而是要一个个的字符串分别作为入参传递,最终以 NULL 表示结束;其中 arg0 仍旧对应于程序名。

如函数命名中带字母 e 的,则表示可以指定新程序的环境变量,否则使用调用者的当前环境变量。

如函数命令中带字母 v 的,则表示程序入参使用 argv 数组形式提供。

简单总结如下:

字母 含义
p 如不带‘/’路径,则默认从 PATH 环境变量路径查找
l 参数需一个个字符串单独传入,以 NULL 结尾
v 参数以 argv 字符串数组列表传递,也是以 NULL 结尾
e 可以手动指定新程序的环境变量