exec 系列函数将当前正在运行的进程替换为新进程。它可用于通过使用另一个 C 程序来运行 C 程序。它位于头文件unistd.h 下。 exec 家族中有许多成员,如下所示。
file: 指向与正在执行的文件关联的文件名。
argv: 是一个空字符指针数组。
让我们看一个小例子来展示如何在 C 中使用 execvp() 函数。我们将有两个 .C 文件,EXEC.c和execDemo.c,我们将通过调用 execvp() 将 execDemo.c 替换为 EXEC.c execDemo.c 中的函数。
现在,使用命令创建 EXEC.c 的可执行文件
现在,使用命令创建 execDemo.c 的可执行文件
使用命令 ./excDemo 运行 execDemo.c 的可执行文件后,我们得到以下输出:
path:应该指向正在执行的文件的路径。
argv[]:是一个空字符指针数组。
让我们看一个小例子来展示如何在 C 中使用 execv() 函数。这个例子类似于上面为 execvp() 显示的例子。我们将有两个 .C 文件,EXEC.c和execDemo.c,我们将通过调用 execDemo.c 中的 execv() 函数将 execDemo.c 替换为 EXEC.c。
现在,使用命令创建 EXEC.c 的可执行文件
现在,使用命令创建 execDemo.c 的可执行文件
使用命令 ./excDemo 运行 execDemo.c 的可执行文件后,我们得到以下输出:
上面显示的语法有一个与上述所有 exec 成员不同的参数,即
char * const envp[]: 允许调用者通过参数 envp 指定执行程序的环境。
envp:此参数是一个指向以空字符结尾的字符串的指针数组,并且必须以空指针结尾。其他函数从调用进程中的外部变量 environ 获取新进程映像的环境。
- execvp:使用此命令,创建的子进程不必运行与父进程相同的程序。该高管类型的系统调用允许一个进程运行的任何程序文件,包括二进制可执行文件或shell脚本。 句法:
int execvp (const char *file, char *const argv[]);
//EXEC.c
#include<stdio.h>
#include<unistd.h>
int main()
{
int i;
printf("I am EXEC.c called by execvp() ");
printf("n");
return 0;
}
gcc EXEC.c -o EXEC
//execDemo.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
//A null terminated array of character
//pointers
char *args[]={"./EXEC",NULL};
execvp(args[0],args);
/*All statements are ignored after execvp() call as this whole
process(execDemo.c) is replaced by another process (EXEC.c)
*/
printf("Ending-----");
return 0;
}
gcc execDemo.c -o execDemo
I AM EXEC.c called by execvp()当文件 execDemo.c 被编译时,只要语句 execvp(args[0],args) 被执行,这个程序就会被程序 EXEC.c 替换。“Ending---”没有打印出来,因为只要调用 execvp() 函数,这个程序就会被 EXEC.c 程序替换。
- execv:这在语法方面也与 execvp() 函数非常相似。execv()的语法如下所示:语法:
int execv(const char *path, char *const argv[]);
//EXEC.c
#include<stdio.h>
#include<unistd.h>
int main()
{
int i;
printf("I am EXEC.c called by execv() ");
printf("n");
return 0;
}
gcc EXEC.c -o EXEC
//execDemo.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
//A null terminated array of character
//pointers
char *args[]={"./EXEC",NULL};
execv(args[0],args);
/*All statements are ignored after execvp() call as this whole
process(execDemo.c) is replaced by another process (EXEC.c)
*/
printf("Ending-----");
return 0;
}
gcc execDemo.c -o execDemo
I AM EXEC.c called by execv()
- execlp 和 execl:这两个也有相同的目的,但它们的语法有点不同,如下所示:语法:
int execlp(const char *file, const char *arg,.../* (char *) NULL */);
int execl(const char *path, const char *arg,.../* (char *) NULL */);
- file: 与正在执行的文件关联的文件名 const char *arg 和 ellipses:描述一个或多个指向空终止字符串的指针的列表,这些字符串表示已执行程序可用的参数列表。 上面显示的相同 C 程序可以使用 execlp() 或 execl() 函数执行,它们将执行相同的任务,即用新进程替换当前进程。
- execvpe 和 execle:这两个也有相同的目的,但它们的语法与上述所有 exec 系列成员都有点不同。它们的语法如下所示: 语法:
int execvpe(const char *file, char *const argv[],char *const envp[]);
Syntax:
int execle(const char *path, const char *arg, .../*, (char *) NULL,
char * const envp[] */);