1.exec族依赖的头文件

#include<unistd.h>

extern char**environ;

2函数声明

//第一个参数:可执行程序所在的绝对位置

//第二个参数:可执行程序运行时所需的参数,这里是一个可变参数,每个参数之间用逗号分割

//参数结束时,最后一个参数是:NULL

int execl(constchar *path, const char *arg, ...);

//注意,这里函数名加了p,表示调用了系统的环境变量中配置的PATH,查看环境变量命令:Echo $PATH

//第一个参数:只需要写上文件名即可,不用写全路径,后面的参数和上面的参数相同

int execlp(constchar *file, const char *arg, ...);

//第一个参数:全路径

//envp[],表示传递的是环境变量的数组

int execle(constchar *path, const char *arg,

..., char * const envp[]);

//这个和第一个exec函数区别是,这里的参数不是可变参数了,而是通过一个传递一个数组的方式进行传递进去。

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

//execvp和execv的区别仅仅是文件名和路径的区别。

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

//这时候传递环境变量

int execvpe(constchar *file, char *const argv[],

char *const envp[]);

3.注意:

A:这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错则返回-1,所以exec函数只有出错的返回值而没有成功的返回值。

B: 这些函数原型看起来很容易混,但只要掌握了规律就很好记。不带字母p(表示

path)的exec函数第一个参数必须是程序的相对路径或绝对路径,例如“/bin/ls”或“./

a.out”,而不能是“ls”或“a.out”。对于带字母p的函数:

如果参数中包含/,则将其视为路径名。

否则视为不带路径的程序名,在PATH环境变量的目录列表中搜索这个程序。

带有字母l(表示list)的exec函数要求将新程序的每个命令行参数都当作一个参数传

给它,命令行参数的个数是可变的,因此函数原型中有…,…中的最后一个可变参数应该是

NULL,起sentinel的作用。对于带有字母v(表示vector)的函数,则应该先构造一个指向

各参数的指针数组,然后将该数组的首地址当作参数传给它,数组中的最后一个指针也应该

是NULL,就像main函数的argv参数或者环境变量表一样。

C:对于以e(表示environment)结尾的exec函数,可以把一份新的环境变量表传给它,其他exec函数仍使用当前的环境变量表执行新程序。

D:exec调用举例如下:

char *const ps_argv[] ={"ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL};

char *const ps_envp[]={"PATH=/bin:/usr/bin", "TERM=console", NULL};

execl("/bin/ps", "ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);

execv("/bin/ps", ps_argv);

execle("/bin/ps", "ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL, ps_envp);

execve("/bin/ps", ps_argv,ps_envp);

execlp("ps", "ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);

execvp("ps", ps_argv);

E: 事实上,只有execve是真正的系统调用,其它五个函数最终都调用execve,所以execve在man手册第2节,其它函数在man手册第3节。这些函数之间的关系如下图所示。

4.案例说明:

运行结果:

5. 由于exec函数只有错误返回值,只要返回了一定是出错了,所以不需要判断它的

返回值,直接在后面调用perror即可。注意在调用execlp时传了两个“ps”参数,第一

个“ps”是程序名,execlp函数要在PATH环境变量中找到这个程序并执行它,而第二

个“ps”是第一个命令行参数,execlp函数并不关心它的值,只是简单地把它传给ps程

序,ps程序可以通过main函数的argv[0]取到这个参数。

调用exec后,原来打开的文件描述符仍然是打开的。利用这一点可以实现I/O重定向。

先看一个简单的例子,把标准输入转成大写然后打印到标准输出:

运行结果:

运行结果:

分析:

wrapper程序将命令行参数当作文件名打开,将标准输入重定向到这个文件,然后调用

exec执行upper程序,这时原来打开的文件描述符仍然是打开的,upper程序只负责从标准输入读入字符转成大写,并不关心标准输入对应的是文件还是终端。

exec族

l 命令行参数列表

p 搜素file时使用path变量

v 使用命令行参数数组

e 使用环境变量数组,不使用进程原有的环境变量,设置新加载程序运行的环境变量

5进程原语:execl(),execlp(),execle(),execv(),execvp(),execvp(),execve()相关推荐

  1. Linux 进程11【exec族函数(execl, execlp, execle, execv, execvp, execvpe)】

    linux进程-exec族函数(execl, execlp, execle, execv, execvp, execvpe) 原文链接:https://blog.csdn.net/u014530704 ...

  2. Linux进程5:exec族函数(execl, execlp, execle, execv, execvp, execvpe)总结及exec配合fork使用

    exec族函数(execl, execlp, execle, execv, execvp, execvpe)及exec配合fork使用 exec族函数函数的作用: 我们用fork函数创建新进程后,经常 ...

  3. Linux进程 exec族函数(execl,execlp,execle,execv,execvp,execcvpe)

    exec族函数的作用 我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序.当进程调用exec函数时,该进程被完全替换为新程序.因为调用exec函数并不创建新进程,所以前 ...

  4. linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)

    原文链接:https://blog.csdn.net/u014530704/article/details/73848573 exec族函数函数的作用: 我们用fork函数创建新进程后,经常会在新进程 ...

  5. 10.linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)

    1.exec族函数函数的作用: 1.exec族函数的作用: 我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序.当进程调用exec函数时,该进程被完全替换为新程序.因为 ...

  6. 学习笔记——exec族函数详解(execl, execlp, execle, execv, execvp, execvpe )

    exec族函数的定义 定义 exec函数族提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段.代码段和堆栈段,在执行完之后,原调用 ...

  7. exec族函数————execl, execlp, execle, execv, execvp, execvpe

    exec族函数 exec族函数的作用[^1] exec族函数的定义 函数原型: exac函数归为带l.带p.带v.带e 四类来说明参数特点 一.带l的一类exac函数(l表示list),包括execl ...

  8. execlp使用例子_linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用...

    本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...

  9. linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用

    本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...

  10. exec系列函数(execl,execlp,execle,execv,execvp)使用

    一.exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离.这样的好处是有更多的余地对两种操作进行管理. 当我们创建了一个进程之后,通常将子进程替换成新 ...

最新文章

  1. 控制车辆运行的19个神经元
  2. Java并发学习之玩转线程池
  3. Django book 中文
  4. Java 集合系列04之 fail-fast总结
  5. 剑指云原生数据库 2.0,阿里云发布全新一站式敏捷数据仓库解决方案
  6. Java接口、implements关键字、接口中抽象方法,默认方法,静态方法,私有方法,常量、final关键字
  7. 差分管电路图_最简单的单差分OCL功放电路图(四款单差分OCL功放电路设计原理图详解)...
  8. Safari浏览器兼容性问题处理
  9. 信息安全术语中英文词条对照表
  10. 配置访问路径自定义的swagger接口说明文档api
  11. AR/VR软件与硬件技术
  12. 初中数学知识点总结_初中数学知识点汇总大全【超详细】,初中数学知识点归纳公式大全...
  13. 已解决(pip报错)WARNING: The repository located at mirrors .aliyun.com is not a trusted or secure host and
  14. 2017 MongoDB中国用户大会部分嘉宾访谈集萃
  15. 安卓电话补充业务 SS
  16. Linux—教你两个方法轻松找回root密码
  17. vue 中canvas 根据点画出圆滑的曲线
  18. 栈的存储——顺序存储与链式存储
  19. 一文读懂 Git GitHub Gitee(码云)的操作
  20. TCP第三次握手失败怎么办,即最后一次握手失败

热门文章

  1. Scrapy框架的学习(4.scrapy中的logging模块记录日志文件以及普通的项目中使用)
  2. OpenCASCADE:形状愈合之用于修复、分析和升级的辅助工具
  3. OpenCASCADE:建模算法之隐藏线去除
  4. boost::python::dict相关的测试程序
  5. boost::hof::rotate用法的测试程序
  6. boost::hana::monadic_compose用法的测试程序
  7. boost::hana::is_an用法的测试程序
  8. boost::allocator_void_pointer
  9. boost::callable_traits的is_invocable的测试程序
  10. ITK:图像区域重叠