exec系列函数都具有用新进程替换当前正在运行的进程的功能。它可以通过一个C程序来运行另一个C程序。且允许进程运行任何程序文件,其中包括二进制可执行文件或shell脚本。它位于头文件unistd.h下。exec 系列中有许多成员,下面我们将要一个一个介绍他们。
execvp 和 execv
这两个函数,都可以创建与父进程内容不同子进程。其用法如下:
// file:要执行程序的名字,如果不指定目录,则在/bin 和 /user/bin查找程序
// argv:用来给程序传递的参数,是以NULL结尾的字符指针数组
int execvp(const char *file,char * const argv[]);
// path: 要执行程序的名字,指定若不指定目录,则在当前目录下查找可执行程序
// argv:用来给程序传递的参数,是以NULL结尾的字符指针数组
int execv(const char *path, char *const argv[]);
可以看到他们的区别在于如果只输入文件名,不给定目录,则他们各自的行为不同,一个会在/bin和 /user/bin 下查找给定的文件名,另一个则在当前程序所运行的目录下查找。如果给定了完整的路径,则两个执行结果是一致的。
让我们看一个小例子来说明如何在C中使用execvp()函数。我们将有两个.c文件,EXEC.c
和execDemo.c
,我们在execDemo.c中通过调用的execvp()函数把execDemo.c替换成EXEC.c的程序。
//-----------EXEC.c--------
#include<stdio.h>
#include<unistd.h>
int main()
{
int i;
printf("I am EXEC.c called by execvp() ");
printf("\n");
return 0;
}
现在,使用命令创建 EXEC.c
的可执行文件
gcc EXEC.c -o EXEC
//---------execDemo.c--------
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
// 以NULL结尾的字符指针数组, 给定了完整路径
char *args[]={"./EXEC",NULL};
execvp(args[0],args);
// 在execvp()调用后忽略所有语句
// 因为整个进程(execDemo.c)被另一个进程(EXEC.c)替换
printf("Ending-----");
return 0;
}
现在,使用命令创建 execDemo.c
的可执行文件
gcc execDemo.c -o execDemo
使用./excDemo
命令运行execDemo.c
的可执行文件后,得到以下输出:
I AM EXEC.c called by execvp()
语句execvp(args[0],args)一执行,这个程序就被程序EXEC.c替换。后面的
Ending-----
没有打印出来,因为一旦调用execvp()函数,这个程序就会完全被程序EXEC.c替换。同时看到,execvp 的第一个参数是
const char *file
,而我们给定了完整的路径./EXEC
,所以它会执行我们给定的路径下的程序。
思考:如果把 ./EXEC
改成 EXEC
会怎么样?程序执行结果还会一样吗?如果 execvp
换成 execv
又会有什么样的结果呢?
execlp和execl
这两个也有相同的用途,他们之间的不同和 execvp
、 execv
之间的不同是一样的。只是execv 中的 v
变成了 l
这意味着程序所接受的参数指针数组是可以多个的。
int execlp(const char *file, const char *arg,.../* (char *) NULL */);
int execl(const char *path, const char *arg,.../* (char *) NULL */);
execvpe和execle
这两个也服务于相同的目的,但是它们的语法与上述exec家族的所有成员略有不同。两者的联结如下所示:
int execvpe(const char *file, char *const argv[],char *const envp[]);
int execle(const char *path, const char *arg, .../*, (char *) NULL,
char * const envp[] */);
上面显示的语法与上述所有EXEC成员有一个不同的参数,即:
char *const envp[]
:允许调用者通过参数envp指定执行程序的环境。
envp:这个参数是指向以null结尾的字符串的指针数组,必须以null指针结束。其他函数从调用进程中的外部变量environ获取新进程映像的环境。
网友评论