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");
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++)
{
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;
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");
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++)
{
printf("%s ", argv[i]);
}
printf("\n");
exit(0);
}
|