exec函数族

2026-08-18 02:59:52

目录exec函数族执行指定目录下的程序执行PATH环境变量能够搜索到的程序执行指定路径, 指定环境变量下的程序实例程序

exec函数族

让父子进程执行不相干的操作

能够替换进程地址空间中的源代码.txt段

当前程序中调用另外一个应用程序

是否需要exec函数族判断: 首先考虑exec之前需要fork

返回值: (1) 如果函数执行成功, 不返回; (2) 执行失败, 打印错误信息, 退出当前进程

头文件: #include

系统环境变量: extern char **environ;

执行指定目录下的程序

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

一般执行自己写的程序

参数:

path: 要执行的程序的绝对路径

变参args: 要执行的程序的需要的参数

第一arg: 占位, 任意, 不能为空, 一般写执行程序名

后边的arg: 命令的参数

参数写完之后: NULL

execl("/home/robin/a.out", "a.out", NULL);

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

参数:

char* argv[] = {"a.out", NULL};

execv("/home/robin/a.out", argv);

执行PATH环境变量能够搜索到的程序

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

执行系统自带的程序, 即不需用绝对路径

参数:

file: 执行的命令的名字

变参arg:

第一arg: 占位

后边的arg: 命令的参数

参数写完之后: NULL

execpl执行自定义的程序: file参数绝对路径

示例

execlp("ls", "ls", "-la", NULL);

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

示例

char* arg[] = {"ls", "-a", "-l", NULL};

execvp("ls", arg);

执行指定路径, 指定环境变量下的程序

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

从用户指定的目录中搜索指定的命令

参数:

path: 执行的程序的绝对路径

arg: 执行的程序的参数

envp: 用户自己指定的搜索目录, 代替PATH

示例

char* env[] = {"/bin", "./", "/home/robin", NULL}; // 自己指定环境变量,对应PATH

execle("/bin/ls", "ls", "-l", "-a", NULL, env);

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

示例

char* argv[] = {"ps", "a", "u", "x", NULL};

char* env[] = {"/bin", "/home/", "./", NULL};

execve("/bin/ps", argv, env);

实例程序

#include

#include

#include

#include

#include

int main(int argc, char *argv[]) {

pid_t pid;

pid = fork();

if(pid == -1) {

perror("fork");

exit(1);

}

if(pid == 0) {

// 子进程执行另外一个程序

#if 0

// ++++++++++++++++++++ execl ++++++++++++++++++++

/*

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

函数描述:加载一个进程,通过路径 + 程序名来加载。

函数参数:

path:程序路径+程序名字

arg:可执行程序的相关参数,使用NULL结尾

返回值:

成功:无返回

失败:-1

*/

// 子进程执行指定目录下的自己编写的程序,该程序参数

printf("this is func +++++++++ execl +++++++++\n");

execl("/home/robin/a.out", "a.out", NULL);

// 如果执行成功没有返回值

perror("execl");

exit(1);

#endif

#if 0

// ++++++++++++++++++++ execlp ++++++++++++++++++++

/*

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

函数描述:加载一个进程,借助PATH环境变量,该函数需要配合PATH环境变量来使用,

当PATH中所有目录搜索后没有参数1则出错返回

函数参数:可执行程序的相关参数,使用NULL结尾

file:可执行程序的名字

arg:可执行程序的相关参数,使用NULL结尾

返回值:

成功:无返回

失败:-1

*/

printf("this is func +++++++++ execlp +++++++++\n");

execlp("ls", "ls", "-la", NULL);

// 如果执行成功没有返回值

perror("execlp");

exit(1);

#endif

#if 0

// ++++++++++++++++++++ execvp ++++++++++++++++++++

/*

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

用法同 execlp

*/

printf("this is func +++++++++ execvp +++++++++\n");

char* arg[] = {"ls", "-a", "-l", NULL};

execvp("ls", arg);

// 如果执行成功没有返回值

perror("execvp");

exit(1);

#endif

#if 0

// ++++++++++++++++++++ execle ++++++++++++++++++++

/*

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

* 从用户指定的目录中搜索指定的命令

*/

printf("this is func +++++++++ execle +++++++++\n");

char* env[] = {"/bin", "./", "/home/robin", NULL}; // 自己指定环境变量,对应PATH

execle("/bin/ls", "ls", "-l", "-a", NULL, env);

// 如果执行成功没有返回值

perror("execle");

exit(1);

#endif

#if 0

// ++++++++++++++++++++ execv ++++++++++++++++++++

/*

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

* 用法同:execl

*/

printf("this is func +++++++++ execve +++++++++\n");

char* argv[] = {"a.out", NULL};

execv("/home/robin/a.out", argv);

// 如果执行成功没有返回值

perror("execv");

exit(1);

#endif

#if 1

// ++++++++++++++++++++ execve ++++++++++++++++++++

/*

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

*/

printf("this is func +++++++++ execve +++++++++\n");

char* argv[] = {"ps", "a", "u", "x", NULL};

char* env[] = {"/bin", "/home/", "./", NULL};

execve("/bin/ps", argv, env);

// 如果执行成功没有返回值

perror("execve");

exit(1);

#endif

}

else if(pid > 0)

printf("parent process +++++++++++++++++++\n");

printf("*****************************\n");

return 0;

}