美文网首页
C 中的 exec 系列函数

C 中的 exec 系列函数

作者: wjundong | 来源:发表于2019-12-04 15:11 被阅读0次

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.cexecDemo.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

这两个也有相同的用途,他们之间的不同和 execvpexecv之间的不同是一样的。只是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获取新进程映像的环境。

参考exec(3) man page

相关文章

  • C 中的 exec 系列函数

    exec系列函数都具有用新进程替换当前正在运行的进程的功能。它可以通过一个C程序来运行另一个C程序。且允许进程运行...

  • PHP的exec()

    php中可以使用 exec() 函数调用外部函数。 语法: string exec ( string $comma...

  • exec系列函数介绍

    介绍 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec...

  • php命令执行函数

    Exec函数 Exec函数的语法为: exec ( string $command [, array &$outp...

  • [c/c++]6. exec函数

    exec 曾提及用fork函数创建新的子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种e...

  • 代码审计——命令执行

    了解命令执行函数 system()passthru() 需回显示函数exec() shell_exec() ` `...

  • python函数专讲:exec执行函数

    今天的Python学习教程想跟大家说一下exec执行函数 exec 函数功能:执行储存在字符串或文件中的 Pyth...

  • 进程控制二

    函数exec 函数介绍 这几个函数若出错返回-1,成功不返回。 这几个函数的区别 我们看到这几个函数都是exec开...

  • C语言中 *.c和*.h文件的区别!

    俗话说,目标决定动力,细节决定成败!C文件就是C语言系列的源文件,而H文件则是C语言的头文件,即C系列中存放函数和...

  • PHP 执行外部程序 PHP 执行系统命令

    务必确认当前PHP 环境的几个函数是可用的状态 then 看手册 or PHP中exec,system等函数调用系...

网友评论

      本文标题:C 中的 exec 系列函数

      本文链接:https://www.haomeiwen.com/subject/ulllgctx.html