当我们fork创建新的子进程后,子进程通常调用exec函数以执行另一个程序。当进程
调用exec函数时,进程执行的程序完全替换为新的程序。exec并不创建新的进程,
所以前后进程的ID并未改变。(exec函数使得进程控制更加完善)
有六个以exec开头的函数,统称为exec函数
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
exec+l :
字母 l(list)要求将命令中的每个命令行参数都当做参数传给它,命令行参数可
变。最后以NULL结尾。
exec+v
字母 v (vector)构造一个指向各个参数的指针数组,把数组首地址当做参数传
递,数组中最后也已NULL结尾。
exec+e:
字母 e (environment)把新的环境变量表传给它。
exec+p :
不带字母p (表示path)的exec函数 第一个参数必须是程序的相对路径或绝对路径,例
如"/bin/ls"或"./a.out",而不能 是"ls"或"a.out"。
对于带字母p的函数: 如果参数中包含/,则将其视为路径名。 否则视为不带路径的程
序名,在PATH环境变量的目录列表中搜索这个程序。
l 和 v 不共存。
这些函数如果调用成功直接执行新的程序,出错返回 -1 。因此只有出错返回值。
这些函数中只有execve是内核的系统调用。其他的只是库函数,最终都要调用execve。