在前面的章节中,我们讨论了如何使用 fork 函数创建子进程,通常子进程会调用一种 exec 函数来执行另一个程序。当进程调用 exec 函数时,该进程会完全被新程序取代,而新程序则从其 main 函数开始执行。因为调用 exec 并不创建新进程,所以前后的进程 ID 并不会改变。exec 只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。

有六种不同的 exec 函数可以使用,它们常常被统称为 exec 函数。这些 exec 函数是 UNIX 进程控制原语。用 fork 可以创建新进程,用 exec 可以执行新的程序。exit 函数和两个 wait 函数处理终止和等待终止。这些是我们需要的基本进程控制原语。在后面各节中将使用这些原语构造另外一些如 popensystem 之类的函数。


#include <unistd.h>



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[]);

</unistd.h>

这六个函数的返回值:如果出错则返回 -1,如果成功则不返回。这些函数之间的第一个区别是前四个取路径名作为参数,后两个则取文件名作为参数。

为了更好地理解这些内容,可以参考以下几篇相关资料: