fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序,当进程调用一种 exec 函数时,该进程执行的程序完全替换为新程序,而新程序则从其 main 函数开始执行,但是 exec 函数并不创建新进程,因此调用前后的进程 ID 并不发生改变,exec 只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段
有6种不同的 exec 函数可供使用:
int execl (const char *pathname, const char *arg0, ... /* (char *)0 */ );
int execv (const char *pathname, char *const argv[] );
int execle (const char *pathname, const char *arg0, ... /* (char *)0, char *const envp[] */ );
int execve (const char *pathname, char *const argv[] , char *const envp[] );
int execlp (const char *filename, const char *arg0, ... /* (char *)0 */ );
int execvp (const char *filename, char *const argv[] );
六个函数都定义于 头文件中,若出错返回-1,若成功则没有返回值
存放在硬盘上的可执行程序文件被执行的唯一方法就是由一个现有进程调用上述六个 exec 函数中的某一个
六个函数的区别在于前四个以路径名作为参数,后两个以文件名为参数,如果 filename 中包含 /,则将其视为路径名,否则在 PATH 环境变量所指