Exec函数族定义:
exec函数族提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。
系统中每个进程都由fork+exec构成
exec分类:
- 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[])
1、2、3点为一组,4、5、6点为一组,这两组函数的不同在于exec后的第一个字符,第一组是l,在此称,为execl系列;第二组是v,在此称为execv系列。这里的l是list(列表)的意思,表示execl系列函数需要将每个命令行参数作为函数的参数进行传递;而v是vector(矢量)的意思,表示execv系列函数将所有函数包装到一个矢量数组中传递即可。
第6点为系统调用,其余全为库函数
参数说明:
path:要执行的程序路径。可以是绝对路径或者是相对路径。在execv、execve、execl和execle这4个函数中,使用带路径名的文件名作为参数。
file:要执行的程序名称。如果该参数中包含“/”字符,则视为路径名直接执行;否则视为单独的文件名,系统将根据PATH环境变量指定的路径顺序搜索指定的文件。
argv:命令行参数的矢量数组。
envp:带有该参数的exec函数可以在调用时指定一个环境变量数组。其他不带该参数的exec函数则使用调用进程的环境变量。
arg:程序的第0个参数,即程序名自身。相当于argv[O]。
…:命令行参数列表。调用相应程序时有多少命令行参数,就需要有多少个输入参数项。注意:在使用此类函数时,在所有命令行参数的最后应该增加一个空的参数项(NULL),表明命令行参数结束。
返回值:一1表明调用exec失败,无返回表明调用成功。
Exec函数示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
int main(int argc,char* argv[],char* envp[])
{
char* myargv[] = {"ps","-f",0};
printf("main pid = %d , ppid = %d\n" ,getpid(),getppid());
//execl("/bin/ps","ps","-f",(char*)0);
//execlp("ps","ps","-f",(char*)0);
//execle("/pin/ps","ps","-f",(char*)0,envp);
//execv("/bin/ps",myargv);
//execvp("ps",myargv);
execve("/bin/ps",myargv,envp);
perror("execl error");
exit(0);
}
编译 gcc -o main main.c
运行 . /main
运行结果
可见,进程ps -f 的pid即为main的pid,ppid也为main的ppid。
原调用进程的其他全部被新的进程替换,但其进程号不变。
(部分摘录于百度百科)