Exec函数族(进程替换)-Linux

mac2026-01-27  5

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。

原调用进程的其他全部被新的进程替换,但其进程号不变。


(部分摘录于百度百科)

最新回复(0)