文章目录

  • execvp
  • execv
  • execlp和execl
  • execvpe和execle
  • 参考文档

(根据参考文档翻译整理而成,针对原文有补充)
    exec函数家族用新进程替换当前正在运行的进程。它可以通过使用另一个C程序来运行一个C程序,它位于头文件unistd.h下。 exec系列中有许多成员,下面以示例显示。

execvp

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

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

    file:表示被执行的文件的文件名
    argv:是以null结尾的字符指针数组。argv参数描述了一个或多个指向以null结尾的字符串的指针列表,这些字符串作为参数列表传递给file文件进行执行
示例1
    让我们看一个小例子,展示如何在C中使用 execvp() 函数。我们将有两个.C文件,EXEC.c和execDemo.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()
{ //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取代。
示例2
    execvp执行shell的示例,d.sh内容为:

#!/bin/bash
date

    test.c与d.sh在同一目录下,内容为:

#include        <stdio.h>
int main()
{char *arglist[]={"sh","d.sh",NULL};printf("begin\n");execvp("sh",arglist);printf("end\n");
}

    编译并执行,因为execvp执行d.sh后就结束了,所以并不会打印"end"。

# gcc test.c -o test
# ./test
begin
Mon Feb 15 22:30:17 CST 2021
execv

    execv:就语法而言,与 execvp() 函数非常相似。
    语法:

int execv(const char *path, char *const argv[]);

    path:指向正在被执行文件的路径
    argv[]:是以null结尾的字符指针数组
示例3
    让我们看一个小例子来说明如何在C中使用 execv() 函数。这个例子类似于上面显示的 execvp() 的例子。

//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()

    execvp和execv的区别,是第一个参数的不同,一个是file,一个是path,如果将示例2修改为execv的程序,test.c代码如下:
示例4

#include        <stdio.h>
int main()
{char *arglist[]={"sh","d.sh",NULL};printf("begin\n");execv("/bin/bash",arglist);printf("end\n");
}
execlp和execl

    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和省略号:描述一个或多个指向以null终止的字符串的指针的列表,这些字符串表示可用于执行的程序的参数列表。
    上面的相似的C程序可以用 execlp() 或 execl() 函数执行,它们将执行相同的任务,即用新进程替换当前进程。
示例5
    将示例2中的test.c改成execl的程序为:

#include        <stdio.h>
int main()
{char *arglist[]={"sh","d.sh",NULL};printf("begin\n");execl("/bin/bash",arglist[0], arglist[1], arglist[2]);printf("end\n");
}
execvpe和execle

    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获取新进程映像的环境。

参考文档

[1]MAZHAR IMAM KHAN.exec family of functions in C[EB/OL].https://www.geeksforgeeks.org/exec-family-of-functions-in-c/,2019-05-24.

了解C语言中的exec函数家族相关推荐

  1. c语言其他函数调用main函数,C语言中的main函数以及main函数是如何被调用的

    main函数是C语言中比较特殊的函数,C程序总是从main函数开始执行,main函数的原型是: int main(int argc, char *argv[]); 其中argc是命令行参数的个数,ar ...

  2. c语言中的printf函数_C语言中的printf()函数与示例

    c语言中的printf函数 C语言中的printf()函数 (printf() function in C) The printf() function is defined in the <s ...

  3. c语言的point函数,C语言中friend友元函数详细解析

    C语言中friend友元函数详细解析 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字frien ...

  4. C语言中的strstr函数

    C语言中的strstr函数 说到strstr函数,可能很多人会比较陌生,对比其他的字符串函数比如strcpy,strcmp等等,它的确比较少用,但其实他也是一个非常有用和常见的函数,今天,就让我们一起 ...

  5. C语言中的atoi函数的实现

    C语言中有很多的库函数,其实平时没事的时候多去实现一下里面的库函数还是很有用的,下面就来讲一讲C语言中的atoi函数,这个函数的主要功能是将一个字符串转化为一个数字,可能第一眼看上去,你会觉得这是一个 ...

  6. main c语言中变量的定义,C语言中在main函数中定义的变量是全局变量么_后端开发...

    PHP 和 JavaSript 区别_后端开发 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,主要用于Web开发领域,而JavaSript是一种具有函数优先的轻量级,解释型或即时编译型的高 ...

  7. C语言中的sprint函数,求sprintf函数的详解

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:求sprintf函数的详解,要附带例,粘贴来的也可以,只 问题详情:还有就是我还想要一些常用的宽度修饰之类的输入或者输出格式:回答: ...

  8. c语言里面gets(a)是什么意思,C语言中的gets()函数

    在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回.如果要读取一行字符串, 比如:I love MIT 这种情况,scanf() ...

  9. C语言中的Sleep函数的解读

    Sleep函数: 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 注意: 在VC中使用带上头文件#include <windows.h& ...

  10. sleep函数的作用c语言,C语言中的sleep函数是什么意思【详细介绍】

    计算机知识:C语言中的Slee函数 Sleep函数简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在V ...

最新文章

  1. java设置虚基类的目的_设置虚基类的目的是( )。
  2. Flask显示图片并设置图片的缓存时间
  3. Lua编译实践1-词法分析:
  4. 字符串,那些你不知道的事
  5. PHP怎么输入表达式,PHP: 表达式 - Manual
  6. Hadoop2.x编程入门实例:MaxTemperature
  7. JS组件系列——Bootstrap Table 表格行拖拽
  8. Loadrunner乱码的解决办法
  9. 电商企业如何利用CRM突出重围?
  10. DAY1 Two Shuffled Sequences
  11. 正态分布的前世今生(靳志辉“Ÿ)
  12. 穆利堂(推荐)WxOA房地产协同办公整体解决方案-河南郑州房地产OA协同办公系统软件 穆穆-movno1
  13. 从冷战到深度学习:一篇图文并茂的机器翻译史
  14. Linux 初始化 init 系统(Systemd)
  15. 嵌入式linux解决方法 | bin文件烧写不到SD卡中
  16. session过期处理问题
  17. 薪酬本地化:Facebook根据居住地发工资会怎样改变劳动力市场?
  18. BilSTM 实体识别_BiLSTM-CRF
  19. 乱舞三国BT版JAVA_乱舞三国志变态版下载
  20. 小学计算机课信息就在我身边教案,人教版小学信息技术教案.doc

热门文章

  1. 基于线性函数近似的安全强化学习 Safe RL with Linear Function Approximation 翻译 2
  2. Python笔记 之 interval模块
  3. python3+urllib撸新浪滚动新闻爬虫
  4. ORB-SLAM3安装遇到的问题及解决
  5. mars2d解决底图上下拖动超出边界出现灰色底
  6. 这里除了安全,什么都不会发生!Docker镜像P2P加速之路
  7. ubuntu20.04下opencv4.4编译、给图片加中文标注及tensorflow的问题记录、ubuntu下使用cv::text::OCRTesseract模块字符识别
  8. 基于R语言对哺乳动物睡眠时间sleep数据集的分析
  9. Codeforces Gym 100015C City Driving 离线LCA
  10. 史上最详细mac安装Qt教程