1. 主页
  2. 文档
  3. C语言教程
  4. C语言预处理器
  5. C中的exec函数族

C中的exec函数族

exec 系列函数将当前正在运行的进程替换为新进程。它可用于通过使用另一个 C 程序来运行 C 程序。它位于头文件unistd.h 下。 exec 家族中有许多成员,如下所示。

  • execvp:使用此命令,创建的子进程不必运行与父进程相同的程序。该高管类型的系统调用允许一个进程运行的任何程序文件,包括二进制可执行文件或shell脚本。 句法:
int execvp (const char *file, char *const argv[]);

file: 指向与正在执行的文件关联的文件名。
argv:  是一个空字符指针数组。

让我们看一个小例子来展示如何在 C 中使用 execvp() 函数。我们将有两个 .C 文件,EXEC.cexecDemo.c,我们将通过调用 execvp() 将 execDemo.c 替换为 EXEC.c execDemo.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()
{
//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;
}

现在,使用命令创建 execDemo.c 的可执行文件

gcc execDemo.c -o execDemo

使用命令 ./excDemo 运行 execDemo.c 的可执行文件后,我们得到以下输出:

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[]);

path:应该指向正在执行的文件的路径。
argv[]:是一个空字符指针数组。

让我们看一个小例子来展示如何在 C 中使用 execv() 函数。这个例子类似于上面为 execvp() 显示的例子。我们将有两个 .C 文件,EXEC.cexecDemo.c,我们将通过调用 execDemo.c 中的 execv() 函数将 execDemo.c 替换为 EXEC.c。

//EXEC.c

#include<stdio.h>
#include<unistd.h>

int main()
{
int i;

printf("I am EXEC.c called by execv() ");
printf("\n");
return 0;
}

现在,使用命令创建 EXEC.c 的可执行文件

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;
}

现在,使用命令创建 execDemo.c 的可执行文件

gcc execDemo.c -o execDemo

使用命令 ./excDemo 运行 execDemo.c 的可执行文件后,我们得到以下输出:

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[] */);

上面显示的语法有一个与上述所有 exec 成员不同的参数,即
char * const envp[]: 允许调用者通过参数 envp 指定执行程序的环境。
envp:此参数是一个指向以空字符结尾的字符串的指针数组,并且必须以空指针结尾。其他函数从调用进程中的外部变量 environ 获取新进程映像的环境。

 

这篇文章对您有用吗?