linux进程中exec函数族的使用

在linux进程中通常使用fork函数来创建父子进程,虽然fork函数采用的是写实拷贝技术,但是当创建的子进程并不想继续与父进程相关的操作时那些拷贝的内容就纯粹属于浪费,那么一个子进程怎样变成一个全新的进程,此时exec函数族的函数就派上用场了。

exec函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。


exec函数族的函数原型如下:

int execl(const char *path, const char *arg, ...);

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

int execle(const char *path, const char *arg, ..., char *const envp[]);

int execlp(const char *file, const char *arg, ...);

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

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

exec函数族共有6个函数,其中的5个是库函数,只有execve是系统调用。下边来介绍函数名字中的’l’, ‘p’, ‘e’, ‘v’的含义。

‘l’表示传递的参数是以列表形式出现即分开的,需要一个一个的传递,比如:execl(“/bin/ps”, “ps”, “ajx”, NULL), 其中第一个参数代表传递的一个要执行的程序的路径,第二个参数必须和第一个参数的文件保持一致,后边的 ajx,NULL都是参数,而且最后一个参数必须是NULL。

‘v’参数表示函数传递的参数是以组合形式的传递而不用一个一个的传递比如:char *buf[] = {“ps”, “ajx”, NULL}; execv(“/bin/ps”, buf),其中buf这个指针数组包含了需要传递参数并且最有一个参数是NULL。

‘p’参数表示exec函数要传递可执行文件的名字,不需要传递文件路径,在执行时会从环境变量中来搜索执行,比如:

execp(“ps”, “ps”, “ajx”, NULL);

‘e’参数表示传递给新进程的环境变量,比如:

char *buf[] = {“PATH=/usr/bin”, NULL};

execle(“./test”, NULL, buf);那么在新的进程中环境变量PATH就变成/usr/bin下的内容了。

exec函数族可以通过不同的参数组合来运行一个新进程,只不过不同组合传递参数的方法和意义不同而已,只要掌握明白l, p, v, e的意义就可以搞定了。

the end

评论(0)