Linux exec函数族
1. 概念:
exec函数族提供了一种在进程中启动另一个程序执行的方法。
它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、
代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。
2. 何时使用exec?
1)当进程认为自己不能再为系统和用户做出任何贡献了时就可以调用exec函数,让自己执行新的程序
2)如果某个进程想同时执行另一个程序,它就可以调用fork函数创建子进程,然后在子进程中调用任何一个exec函数。
这样看起来就好像通过执行应用程序而产生了一个新进程一样
3.相关函数:
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 execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg, ...);
int execvp(const char *file, char *const argv[]);
l : list列表,参数要以列表形式,展现出来。
p : path路径,从系统环境变量中去找可执行文件
v : 向量数组,将列表的参数装到数组中去。
e : 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境。envp也是一个以NULL结尾的字符串数组指针
4.使用区别:
1)可执行文件查找方式
无p:指定完整的文件目录路径,
有p:只给出文件名,系统会自动从环境变量“$PATH”所包含的路径中进行查找。
2)参数表传递方式
有l:表示逐个列举的方式;
有v:表示将所有参数构造成指针数组传递,其语法为char *const argv[]
3)环境变量的使用
exec函数族可以默认使用系统的环境变量,也可以传入指定的环境变量。
这里,以“e”(Enviromen)结尾的两个函数execle、execve就可以在envp[]中传递当前进程所使用的环境变量,一般为NULL即可
例子:
#include <stdio.h> #include <stdlib.h> #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 execvpe(const char *file, char *const argv[], char *const envp[]); */ int main(int argc, const char *argv[]) { // 1 execl("/bin/ls","ls","-l",NULL); printf("AAAA\n");
// 2 execlp("ls","ls","-l",NULL); // 3 char *buf[] = {"ls","-l",NULL}; execv("/bin/ls",buf); return 0; }
测试: 只有1 会执行,后面的都不执行, 因为exec启动的进程取代了原来的 数据段,代码段,堆栈段 printf 也不会执行