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)手册页
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。