exec函数族调用区分
exec函数族是用于在当前进程中启动一个新程序的函数,它有多个变种,用于不同的调用方式和参数组合,这些函数的初始参数是要执行的文件的名称。
exec函数一旦调用成功即执行新的程序,不返回。只有失败才返回,错误值-1。所以通常我们直接在exec函数调用后直接调用perror()和exit(),无需if判断。
其中比较常用的exec函数族包括:
int execl(const char *pathname, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *pathname, const char *arg, ..., char *const envp[] );
int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
这些函数可以根据前缀“exec”后面的字母进行分组,下面将exac函数归为带l、带p、带v、带e 四类来说明参数特点。
I : ( list ) 命令行参数列表
p : (path) 搜索file时使用path变量
v : (vector) 使用命令行参数数组
e : (environment) 使用环境变量数组,不使用进程原有的环境变量,设置新加载程序运行的环境变量
带l 的exec函数:execl , execlp , execle
参数说明: 表示后边的参数以可变参数的形式给出且都以一个空指针结束。并且由于这些是可变函数,因此该指针必须强制转换为(char *) null。
这里要特别说明的是,文件名也是参数,所以第一个参数应该指向与正在执行的文件相关联的文件名。
示例:
#include<stdio.h>
#include <unistd.h>
int main()
{
printf("process begin...\n");
execl("/bin/ls",NULL);
printf("process end ...\n");
return 0;
}
执行结果:用execl 找到并执行ls,将当前进程main替换掉,所以process end ...” 没有在终端被打印出来。
xuedaon@xuedaon:~/XUEDAONIUNIU$ ./a.out
process begin...
1.c a.out t test.c
带v 的exec函数:execv , execvp , execvpe
参数说明: char *const argv[]参数是一个指针数组,这些指针指向以空结尾的字符串,这些字符串表示新程序可用的参数列表。第一个参数应该指向与正在执行的文件相关联的文件名。指针数组必须以空指针结束。
示例:
#include<stdio.h>
#include <unistd.h>
int main()
{
printf("process begin...\n");
char *argv[] = {"ls","-a","-l",NULL};
execvp("ls",argv);
printf("process end ...\n");
return 0;
}
执行结果:在当前目录下查看所有文件的详细信息(包括隐藏文件)
xuedaon@xuedaon:~/XUEDAONIUNIU$ ./a.out
process begin...
总用量 64
drwxrwxr-x 2 xuedaon xuedaon 4096 1月 18 10:09 .
drwxr-xr-x 24 xuedaon xuedaon 4096 1月 18 10:06 ..
-rw-rw-r-- 1 xuedaon xuedaon 184 1月 18 10:09 1.c
-rw-r--r-- 1 xuedaon xuedaon 12288 1月 18 10:09 .1.c.swp
-rwxrwxr-x 1 xuedaon xuedaon 16792 1月 18 10:09 a.out
-rwxrwxr-x 1 xuedaon xuedaon 15588 1月 8 17:02 t
-rw-rw-r-- 1 xuedaon xuedaon 388 1月 17 17:45 test.c
带e 的exec函数:execle, execvpe
参数说明: 调用者的环境通过参数envp指定。envp实参是一个指向以空结束的字符串的指针数组,必须以空指针结束。所有其他exec()函数(后缀中不包括'e')从调用进程的外部变量environ中获取新进程映像的环境。即将环境变量传递给需要替换的进程,原来的环境变量不再起作用。
示例:
// execle程序
#include<stdio.h>
#include <unistd.h>
int main()
{
printf("process begin...\n");
char *envp[] = {"AA=11","BB=22",NULL};
execle("./env","env",NULL,envp);
printf("process end ...\n");
return 0;
}
// env程序
#include <stdio.h>
extern char **environ;
int main()
{
int i = 0;
for(i = 0; environ[i] != NULL; i++)
{
printf("%s\n",environ[i]);
}
return 0;
}
执行结果:先运行env.c程序生成执行文件env放到当前路径下,在运行execle.c程序,发现我们设置的环境变量确实有传进来。
xuedaon@xuedaon:~/XUEDAONIUNIU$ ./execle
process begin...
AA=11
BB=22
带p的exec函数:execlp, execvp
参数说明: 表示第一个参数无需给出具体的路径,只需给出函数名即可,系统会在PATH环境变量中寻找所对应的程序,如果没找到的话返回-1。
示例:
#include<stdio.h>
#include <unistd.h>
int main()
{
printf("process begin...\n");
execlp("ls","ls","-l",NULL);
printf("process end ...\n");
return 0;
}
执行结果:在当前目录下查看所有文件的详细信息
xuedaon@xuedaon:~/XUEDAONIUNIU$ ./a.out
process begin...
总用量 44
-rw-rw-r-- 1 xuedaon xuedaon 155 1月 18 10:06 1.c
-rwxrwxr-x 1 xuedaon xuedaon 16736 1月 18 10:07 a.out
-rwxrwxr-x 1 xuedaon xuedaon 15588 1月 8 17:02 t
-rw-rw-r-- 1 xuedaon xuedaon 388 1月 17 17:45 test.c
exec函数族关系图: