C语言中的exec函数家族介绍和用法

2021年3月27日17:54:29 发表评论 2,793 次浏览

exec函数族用一个新进程替换当前正在运行的进程。它可以通过使用另一个C程序来运行C程序。它位于头文件unistd.h之下。exec家族中有很多成员,下面给出了一些例子。

execvp:使用这个命令,创建的子进程不必运行与父进程相同的程序。exec类型系统调用允许进程运行任何程序文件,其中包括二进制可执行文件或shell脚本。语法:

int execvp (const char *file, char *const argv[]);

file:指向与正在执行的文件相关联的文件名。

argv:是字符指针的以null结尾的数组。

让我们看一个小例子, 展示如何在C语言中使用execvp()函数。我们将有两个.C文件, 执行和execDemo.c我们将通过调用execDemo.c中的execvp()函数将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[]:是字符指针的以null结尾的数组。

让我们看一个小例子, 展示如何在C语言中使用execv()函数。该例子与上面为execvp()显示的例子相似。我们将有两个.C文件, 执行和execDemo.c我们将通过调用execDemo.c中的execv()函数将EXEC.c替换为execDemo.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和省略符:描述一个由一个或多个指针组成的列表,这些指针指向以空结尾的字符串,这些字符串表示被执行程序可用的实参列表。

上面显示的相同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:此参数是指向以null终止的字符串的指针的数组, 并且必须以null指针终止。其他功能从调用过程中的外部变量环境获取新过程映像的环境。

参考: exec(3)手册页

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: