1、函数原型
#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[]);
execl,execlp参数尾部要以NULL结束
execv,execvp参数数组argv[]要以NULL结束
2、函数说明
| exec族成员 | 函数说明 |
|---|---|
| execl | l 表示list参数列表,其函数寻找可执行文件路径时,不访问环境变量 |
| execlp | l 表示list参数列表,execlp将在环境变量中寻找可执行文件 |
| execv | v表示char *argv[]指针数组,可将可执行文件所带参数放入数组中集中表示 |
| execvp | 在execv的基础上,p表示path ,将访问环境变量 |
| execle | 带e表示该函数取envp[]数组,而不使用当前环境 |
| execvpe | 带e表示该函数取envp[]数组,而不使用当前环境 |
3、例程代码
3.1 execl(execlp)
3.1.1 主程序(execl.c)
gcc execl.c -o execl
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <errno.h>
int main(void)
{
pid_t pid;
int cmd;
while(1)
{
printf("waitting client cmd...\r\n");
scanf("%d", &cmd); //等待用户键入命令,模拟服务端接收客户端发送的请求指令
if(cmd == 1)
{
printf("client request service\r\n");
if((pid = fork()) < 0)
{
perror("fork failed,Why:");
}
else if(pid > 0)
{
wait(NULL);//等待子进程执行完毕
printf("run finished.\r\n");
}
else if(pid == 0)
{
printf("fork sucess");
/* 调用execl替代子进程,./execl_task为可执行文件所在路径名。
* 当在相对路径找不到可执行文件名时,不访问环境变量。
* execlp用法相同,所指定的路径找不到可执行文件时,将访问全局变量*/
if(execl("./execl_task", "execl_task", "arg[1]", "arg[2]", NULL) == -1)
{
perror("execl failed,why:");
}
}
}else{
printf("no client request\r\n");
}
}
exit(0);
}
3.1.2 指定execl目标程序(execl_task)
gcc execl_task.c -o execl_task
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
int main(int argc, char *argv[])
{
pid_t pid;
printf("%d\n", argc);
if(argc != 3)
{
perror("argc is fewer");
exit(0);
}
for(int i=0; i<argc; i++) //打印execl函数传递的参数
{
printf("%s ", argv[i]);
}
printf("\n");
exit(0);
}
3.2 execv(execvp)
3.2.1 类比execl(execlp)
execv(execvp)与execl(execlp)的区别在于函数参数不同,execv将可执行文件的目标参数打包成数组,
int execl(const char *path, const char *arg, ...);
int execv(const char *path, char *const argv[]);
3.2.2 主程序(execv.c)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <errno.h>
int main(void)
{
pid_t pid;
int cmd;
//打包execv(execvp)所指的可执行文件所带参数
char *argv[] = {"execl_task", "arg[1]", "arg[2]", NULL};
while(1)
{
printf("waitting client cmd...\r\n");
scanf("%d", &cmd); //等待用户键入命令,模拟服务端接收客户端发送的请求指令
if(cmd == 1)
{
printf("client request service\r\n");
if((pid = fork()) < 0)
{
perror("fork failed,Why:");
}
else if(pid > 0)
{
wait(NULL);//等待子进程执行完毕
printf("run finished.\r\n");
}
else if(pid == 0)
{
printf("fork sucess");
/* 调用execl替代子进程,./execl_task为可执行文件所在路径名。
* 当在相对路径找不到可执行文件名时,不访问环境变量。
* execvp用法相同,所指定的路径找不到可执行文件时,将访问全局变量*/
if(execv("./execl_task", argv) == -1)
{
perror("execv failed,why:");
}
}
}else{
printf("no client request\r\n");
}
}
exit(0);
}
3.2.3 execv目标程序execv_task
gcc execv_task.c -o execv_task
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
int main(int argc, char *argv[])
{
pid_t pid;
printf("%d\n", argc);
if(argc != 3)
{
perror("argc is fewer");
exit(0);
}
for(int i=0; i<argc; i++) //打印execl函数传递的参数
{
printf("%s ", argv[i]);
}
printf("\n");
exit(0);
}
本文详细介绍了Linux系统编程中的exec族函数,包括execl、execlp、execv、execvp、execle和execvpe。这些函数用于在当前进程中替换执行新的程序。文章通过实例代码展示了如何使用这些函数,包括参数列表的构建和环境变量的处理,帮助读者理解它们的区别和用法。
201

被折叠的 条评论
为什么被折叠?



