25.1 介绍

在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序

当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 main 函数开始执行。因为调用 exec 并不创建新进程,所以前后的进程 ID 并未改变。exec 只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。

exec 函数族也称为代码替换函数族

25.1.1 函数说明

#include

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

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

int execle(const char * path,const char * arg,....,char *const envp[]);

int execve(const char * filename,char * const argv[ ],char * const envp[ ]);

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

int execlp(const char * file,const char * arg,……);

函数功能:

execl()用来执行参数 path 字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。

execv() 用来执行参数 path 字符串所代表的文件路径,与 execl() 不同的地方在于 execve() 只需两个参数,第二个参数利用数组指针来传递给执行文件。

execle() 是用来执行参数 path 字符串所代表的文件路径,并为新程序复制最后一个参数所指示的环境变量。接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。

execve()用来执行参数 filename 字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。

execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。

execlp() 会从 PATH 环境变量所指的目录中查找符合参 file 的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的 argv[0]、argv[1]……,最后一个参数必须用空指针 (NULL) 作结束。

返回值

出错返回 -1,错误码存放,成功则不返回

错误码

EACCES

欲执行的文件不具有用户可执行的权限。

欲执行的文件所属的文件系统是以 noexec 方式挂上。

欲执行的文件或 script 翻译器非一般文件。

EPERM

进程处于被追踪模式,执行者并不具有 root 权限,欲执行的文件具有 SUID 或 SGID 位。

欲执行的文件所属的文件系统是以 nosuid 方式挂上,欲执行的文件具有 SUID 或 SGID 位元,但执行者并不具有 root 权限。

E2BIG 参数数组过大

ENOEXEC 无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行。

EFAULT 参数 filename 所指的字符串地址超出可存取空间范围。

ENAMETOOLONG 参数 filename 所指的字符串太长。

ENOENT 参数 filename 字符串所指定的文件不存在。

ENOMEM 核心内存不足

ENOTDIR 参数 filename 字符串所包含的目录路径并非有效目录

EACCES 参数 filename 字符串所包含的目录路径无法存取,权限不足

ELOOP 过多的符号连接

ETXTBUSY 欲执行的文件已被其他进程打开而且正把数据写入该文件中

EIO I/O 存取错误

ENFILE 已达到系统所允许的打开文件总数。

EMFILE 已达到系统所允许单一进程所能打开的文件总数。

EINVAL 欲执行文件的ELF执行格式不只一个PT_INTERP节区

EISDIR ELF翻译器为一目录

ELIBBAD ELF翻译器有问题

注意点

execve 函数为系统调用,其余为库函数。执行 execve 函数后面的代码不执行

execlp 和 execvp 函数中的 path,相对和绝对路径均可使用,其他四个函数中的 path 只能使用绝对路径。相对路径一定要在进程环境表对应的 PATH 中。

argv 参数为新程序执行 main 函数中传递的  argv 参数,最后一个元素为 NULL

envp 为进程环境表

六个函数都使以 "exec"四个字母开头的,后面的字母表示了其用法上的区别:

带有字母 " l " 的函数,表明后面的参数列表是要传递给程序的参数列表,参数列表的第一个参数必须是 要执行的程序,最后一个参数必须是 NULL

带有字母 “ p ”的函数,第一个参数可用是相对路径或程序名,如果无法立即找到要执行的程序,那么就在环境变量 PATH 指定的路径中搜索。其他函数的第一个参数必须是绝对路径

带有字母 " v "的函数,表明程序的参数列表通过一个字符串数组来传递。这个数组和最后传递给程序的 main 函数的字符串数据 argv 完全一样。第一个参数必须是程序名,最后一个参数也必须是 NULL

带有字母 " e " 的函数,用户可用自己设置程序接收一个设置环境变量的数组

六个函数之间的关系如下:

25.2 例子

#include

#include

#include

#include

#include

char *cmd1 = "cat"; //相对路径

char *cmd2 = "/bin/cat";//绝对路径

char *argv1 = "/etc/passwd";

char *argv2 = "/etc/group";

int main(void)

{

pid_t pid;

if((pid = fork()) < ){

perror("fork error");

exit();

} else if(pid == ) {

//子进程调用 exec 函数执行新的程序

//execl 不带 p 需要用绝对路径的

if(execl(cmd2, cmd1, argv1, argv2, NULL) < ) {

perror("execl error");

exit();

} else {

printf("execl %s success\n", cmd1);

}

}

wait(NULL);

printf("=================================\n");

if((pid = fork()) < ){

perror("fork error");

exit();

} else if(pid == ) {

char *argv[] = {cmd1, argv1, argv2, NULL};

if(execvp(cmd1, argv) < ) {

perror("execl error");

exit();

} else {

printf("execvp %s success\n", cmd1);

}

}

wait(NULL);

printf("=================================\n");

return ;

}

二十、Linux 进程与信号---非局部跳转

20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include int setjmp(jmp_buf env); 函数功能:设置非局部跳转 ...

二十六、Linux 进程与信号---system 函数 和进程状态切换

26.1 system 函数 26.1.1 函数说明 system(执行shell 命令)相关函数 fork,execve,waitpid,popen #include

三十、Linux 进程与信号——信号的概念及 signal 函数

30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...

二十三、Linux 进程与信号---进程链和进程扇、守护进程和孤儿进程以及僵尸进程

23.1 进程链和进程扇 23.1.1 概念 进程链:一个父进程构建出一个子进程,子进程再构建出子子进程,子子进程构建出子子子进程.... 这种就为进程链 进程扇:一个父进程构建出多个子进程,子进程都 ...

二十四、Linux 进程与信号---wait 函数

24.1 wait 函数说明 24.1.1 waitpid---等待子进程中断或结束 waitpid(等待子进程中断或结束) 相关函数 wait,fork #include

二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识

21.1 进程查看和进程状态 21.1.1 ps 指令 ps 指令通常可以查看到进程的 ID.进程的用户 ID.进程状态和进程的 Command ps:查看当前用户启动的进程 ps -ef:详细查看后 ...

二十一、Linux 进程与信号---进程资源限制

21.1 进程资源限制 在操作系统中,我们能够通过函数getrlimit().setrlimit()分别获得.设置每个进程能够创建的各种系统资源的限制使用量. 21.1.1 函数 #include & ...

二十七、Linux 进程与信号---进程组和组长进程

27.1 进程组 27.1.1 进程组介绍 进程组为一个或多个进程的集合 进程组可以接受同一终端的各种信号,同一个信号发送进程组等于发送给组中的所有进程 每个进程组有唯一的进程组 ID 进程组的消亡要 ...

Linux学习之CentOS&lpar;二十六&rpar;--Linux磁盘管理:LVM逻辑卷的创建及使用

在上一篇随笔里面 Linux学习之CentOS(二十五)--Linux磁盘管理:LVM逻辑卷基本概念及LVM的工作原理,详细的讲解了Linux的动态磁盘管理LVM逻辑卷的基本概念以及LVM的工作原理, ...

随机推荐

两个viewport的故事(第二部分)

原文:http://www.quirksmode.org/mobile/viewports2.html 在这个迷你系列的文章里边我将会解释viewport,以及许多重要元素的宽度是如何工作的,比如&l ...

&lbrack;vijos P1035&rsqb; 贪婪的送礼者

为何我要做此等弱智题,只因我太久不码代码,心有所虚… 明天的任务是,做些难题,累了就理房间,实在不行就睡觉,不要做别的事情w 目测自己做不到呢OAO program vijos_p1035; ..] ...

Redis数据导入工具优化过程总结

Redis数据导入工具优化过程总结 背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻 ...

NSString&plus;URLEncoding&period;h --使用Obj-C对数据等进行URLEncoding编码

在Objective-c进行网络编程时,经常需要把数据转换成URLEncoding编码,如对+号编码后,变成%2b.这里我们给出一种实现. //NSString+URLEncoding.h #impo ...

java和php实现RSA加密互通-b

java和PHP RSA加密实现互通 1:通过openssl 生成公钥和密钥文件(linux) (1)  生产私钥文件命令 openssl genrsa -out rsa_private_key.pe ...

Oracle 最简单的随系统自己主动启动

Oracle 最简单的随系统自己主动启动 俗话说用户是上帝,他们有时候提出一个问题很的简单,就仅仅须要一句话,一分钟就完事了.可是拿到我们DBA来说,可能至少得半个小时甚至半个月才干满足他的一句话.有 ...

新时代的Vim C&plus;&plus;自动补全插件 clang&lowbar;complete

Vimer的福音 新时代的Vim C++自动补全插件 clang_complete   使用vim的各位肯定尝试过各种各样的自动补全插件,比如说大名鼎鼎的 OmniCppComplete .这一类的插 ...

C&num; 之 反射性能优化1

反射是一种很重要的技术,然而它与直接调用相比性能要慢很多,因此如何优化反射性能也就成为一个不得不面对的问题. 目前最常见的优化反射性能的方法就是采用委托:用委托的方式调用需要反射调用的方法(或者属性. ...

转载 jQuery和js自定义函数和文件的方法(全网最全)

jQuery和js自定义函数和文件的方法(全网最全)    版权声明:本文为像雾像雨又像风_http://blog.csdn.net/topdandan的原创文章,未经允许不得转载. https:// ...

我靠,上班eclipse看糗事百科

package test; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; ...

linux exec 二程序,二十五、Linux 进程与信号---exec函数相关推荐

  1. LINUX学习基础篇(十五)软件包管理

    LINUX学习基础篇(十五)软件包管理 软件包管理 软件包分类 源码包 二进制包 选择 依赖性 rpm包安装 rpm包命名规则 rpm包安装和卸载 服务命令 rpm查询命令 验证 数字证书 rpm中文 ...

  2. Linux的基本学习(十五)——认识系统服务

    Linux的基本学习(十五)--认识系统服务 前言 继续学习Linux 什么是daemon与服务(service) 从CentOS 7.x开始,传统的init已经被抛弃,取而代之的是systemd 什 ...

  3. 漫谈程序员(十五)——应届毕业生上海市落户政策解读

    #漫谈程序员(十五)--应届毕业生上海市落户政策解读   去上海BOC工作,不免考虑是否需要将户口迁移过去.下面就结合<2016年非上海生源普通高校应届毕业生进沪就业评分办法>文件进行详细 ...

  4. Linux的基本学习(十四)——进程管理(下)与SELinux

    Linux的基本学习(十四)--进程管理(下)与SELinux 前言 进程这部分内容真是不少,来,我们继续跟着鸟哥学习. 特殊文件与进程 具有SUID/SGID权限的命令执行状态 SUID的权限其实与 ...

  5. 十五. Python基础(15)--内置函数-1

    十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...

  6. Power BI(十五)power pivot之Summarize函数

    Power BI(十五)power pivot之Summarize函数 我们想统计订单金额的销售金额区间分布,想得到的效果图如下 如下图一笔订单会有多笔记录 传统的方法 生成数据透视表 复制到一个新表 ...

  7. 【正点原子Linux连载】第四十五章 pinctrl和gpio子系统实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  8. linux 多核 系统时钟,Linux时间子系统之(十五):clocksource

    Linux时间子系统之(十五):clocksource 作者:linuxer 发布于:2014-12-1 19:03 分类:时间子系统 一.前言 和洋葱一样,软件也是有层次的,内核往往需要对形形色色的 ...

  9. Linux小小白入门教程(十五):用户和用户组

    Linux是一个权限控制非常严格的操作系统.在不了解Linux权限规则前提下,基本对Linux的操作会寸步难行. 简介 Linux中权限.用户.用户组三者之间关系紧密.要更好的使用Linux,必需掌握 ...

最新文章

  1. restapi如何传图片_iPhone传照片,不是只能用微信QQ,第二种方法很少人知道哦
  2. 阿里云云服务器安装jdk、mysql
  3. 在asp.net中解决cookies中文乱码问题
  4. oracle 的遍历语法,oracle pl/sql之pl/sql语法
  5. springboot 关闭懒加载_SpringBoot新手入门篇
  6. WritePrivateProfileString等读写.ini配置文件
  7. java socket如何请求485协议_javaSE第十五部分 网络编程(1)Socket和ServerSocket
  8. mysql proxy 多主_mysql多主多从架构与mysql-proxy读写分离
  9. 计算机辅助初中数学教学,计算机辅助数学教学的优势
  10. .net敏捷开发及常用工具
  11. vba自动生成html,动态生成嵌入在VBA电子邮件生成中的HTML表
  12. Leetcode134.加油站
  13. 光猫需要已经开通了 telnet 功能
  14. fastadmin项目实战踩坑
  15. 关于代码运行速度与cpu关系的一点小事
  16. C#读取系统注册表信息
  17. [转载]无盘网吧实际施工过程中的注意事项(转)
  18. 如何打造优秀的个人博客
  19. 网站被黑了该如何解决?网站被黑了怎么办
  20. java计算机毕业设计高校体育场馆管理源码+mysql数据库+系统+lw文档+部署

热门文章

  1. 设计模式-观察者模式(Observer)
  2. 修改ubuntu的sources.list源
  3. 插值,拟合,逼近的区别理解
  4. WinSock五种I/O模型的性能分析
  5. 重启redis命令_redis系列之——数据持久化(RDB和AOF)
  6. LVDS 相关功能调式
  7. Quartz 框架快速入门(一)
  8. 我的Ubuntu9.10安装与配置
  9. 重庆两江新区将建国内最大“云计算”数据基地
  10. H5学习从0到1-H5的基本标签(2)