fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。),也就是这两个进程做完全相同的事。

在fork后的子进程中使用exec函数族,可以装入和运行其它程序(子进程替换原有进程,和父进程做不同的事)。

fork创建一个新的进程就产生了一个新的PID,exec启动一个新程序,替换原有的进程,因此这个新的被 exec 执行的进程的PID不会改变(和调用exec的进程的PID一样)。

exec函数族:

#include <unistd.h>extern char **environ;int execl(const char *path,const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path,const char *arg,..., char * const envp[]);int execv(const char *path,char *const argv[]);int execvp(const char *file, char *const argv[]);int execve(const char *file,char *const argv[],char *const envp[]);


exec函数族装入并运行程序path/file,并将参数arg0(arg1, arg2, argv[], envp[])传递给子程序,出错返回-1.
 
在exec函数族中,后缀l、v、p、e指定函数将具有某种操作能力:

后缀 操作能力
l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
v 希望接收到一个以NULL结尾的字符串数组的指针
p 是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件
e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境

具体例子:

#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <errno.h>int main(int argc, char *argv[]){//以NULL结尾的字符串数组的指针,适合包含v的exec函数参数char *arg[] = {"ls", "-a", NULL};/*** 创建子进程并调用函数execl* execl 中希望接收以逗号分隔的参数列表,并以NULL指针为结束标志*/if( fork() == 0 ){// in clild printf( "1------------execl------------\n" );if( execl( "/bin/ls", "ls","-a", NULL ) == -1 ){perror( "execl error " );exit(1);}}/***创建子进程并调用函数execv*execv中希望接收一个以NULL结尾的字符串数组的指针*/if( fork() == 0 ){// in child printf("2------------execv------------\n");if( execv( "/bin/ls",arg) < 0){perror("execv error ");exit(1);}}/***创建子进程并调用 execlp*execlp中*l希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志*p是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件*/if( fork() == 0 ){// in clhild printf("3------------execlp------------\n");if( execlp( "ls", "ls", "-a", NULL ) < 0 ){perror( "execlp error " );exit(1);}}/***创建子里程并调用execvp*v 望接收到一个以NULL结尾的字符串数组的指针*p 是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件*/if( fork() == 0 ){printf("4------------execvp------------\n");if( execvp( "ls", arg ) < 0 ){perror( "execvp error " );exit( 1 );}}/***创建子进程并调用execle*l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志*e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境*/if( fork() == 0 ){printf("5------------execle------------\n");if( execle("/bin/ls", "ls", "-a", NULL, NULL) == -1 ){perror("execle error ");exit(1);}}/***创建子进程并调用execve* v 希望接收到一个以NULL结尾的字符串数组的指针* e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境*/if( fork() == 0 ){printf("6------------execve-----------\n");if( execve( "/bin/ls", arg, NULL ) == 0){perror("execve error ");exit(1);}}return EXIT_SUCCESS;}


运行结果(Linux):------------execl------------
.  ..  .deps  exec  exec.o  .libs  Makefile
------------execv------------
.  ..  .deps  exec  exec.o  .libs  Makefile
------------execlp------------
.  ..  .deps  exec  exec.o  .libs  Makefile
------------execvp------------
.  ..  .deps  exec  exec.o  .libs  Makefile
------------execle------------
.  ..  .deps  .libs  Makefile  exec  exec.o
------------execve-----------
.  ..  .deps  .libs  Makefile  exec  exec.o
按回车继续!


实例分析exec函数相关推荐

  1. python exec函数_Python3 exec 函数

    Python3 exec 函数 描述 exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码. 语法 以下是 exec 的语法: ex ...

  2. python asyncio回调函数_python回调函数用法实例分析

    python回调函数用法实例分析 本文实例讲述了python回调函数用法.分享给大家供大家参考.具体分析如下: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步 ...

  3. python中max函数用法_Python中max函数用法实例分析

    Python中max函数用法实例分析 更新时间:2015年07月17日 15:45:09 作者:优雅先生 这篇文章主要介绍了Python中max函数用法,实例分析了Python中max函数的功能与使用 ...

  4. 影响索引的mysql函数_mysql索引对排序的影响实例分析

    本文实例讲述了mysql索引对排序的影响.分享给大家供大家参考,具体如下: 索引不仅能提高查询速度,还可以添加排序速度,如果order by 后面的语句用到了索引,那么将会提高排序的速度. 测试 1. ...

  5. matlab中函数或变量无法识别怎么办_用MATLAB巧解微分方程实例分析

    点"考研竞赛数学"↑可每天"涨姿势"哦! MATLAB巧解微分方程实例分析 王少华 西安电子科技大学 微分方程求解难, 字母一堆看着烦. 写错数字一时爽, 一直 ...

  6. python函数定义与参数_Python函数的定义方式与函数参数问题实例分析

    本文实例讲述了Python函数的定义方式与函数参数问题.分享给大家供大家参考,具体如下: 涉及内容: 函数的定义方式 函数的文字描述 空操作语句 位置参数 默认参数 关键参数 可变长度参数 函数的定义 ...

  7. python中property函数_python 邮件表格Python中property函数用法实例分析

    本文实例讲述了Python中property函数用法.分享给大家供大家参考,具体如下: 通常我们在访问和赋值属性的时候,都是在直接和类(实例的)的__dict__打交道,或者跟数据描述符等在打交道.但 ...

  8. 程序清单 8-8 exec函数实例,a.out是程序8-9产生的可执行程序

    1 /* 2 ============================================================================ 3 Name : test.c ...

  9. PHP - 回调函数概念与用法实例分析 - 学习/实践

    1.应用场景 主要用于理解回调函数的概念, 对比JavaScript中的回调函数, 更加深刻理解回调函数的本质, 以及如何高效使用~~~ 2.学习/操作 1. 文档阅读 https://www.jb5 ...

最新文章

  1. JavaScript的写类方式(4)——转
  2. odoo API装饰器one、model、multi的区别
  3. k最邻近算法——加权kNN
  4. h5 video 手机上无法显示_怎样把手机上的导航显示在汽车屏幕上
  5. 解决vue中路由跳转同一个路径报错
  6. 慕课网高并发实战(一)-并发与高并发基本概念
  7. [记录] ---阿里云java.io.IOException: Connection reset by peer的问题
  8. VS2003+自带水晶报表的打包部署(CS方式)
  9. HTML5绘制一个3D立方体,HTML5/Canvas交互式3D立方体
  10. 自动驾驶 2-1 第 1 课补充阅读:传感器和计算硬件 -- 上
  11. STM32F429 之EXTI外部中断
  12. bigdecimal如何做除法_bigdecimal类型除法问题
  13. 【Linux】Ubuntu18.04安装微信和QQ【2022】
  14. import mysql data to solr4.2.0
  15. qt开发linux界面软件,利用Qt Designer开发Qt界面
  16. XP系统添加网络打印机步骤
  17. Django相关操作(连续跳转和登录注册为例)
  18. BeanFacotry中的ApplicationContext
  19. Hexo博客Next6.0版本主题配置(背景图片加载、侧边栏社交小图标设置、设置网站图标)
  20. NRF52833对比NRF52832低功耗蓝牙5.0芯片

热门文章

  1. AndroidStudio 3.0升级之compile、implementation简要说明
  2. [js对象]JS入门之Global对象
  3. 《编写高质量代码:改善c程序代码的125个建议》——建议2-6:防止无符号整数回绕...
  4. linux的mtd架构分析【转】
  5. spring基于注解程序开发
  6. 通过图形界面配置Exchange2010 DAG
  7. 打开sql server 验证
  8. 前端每日实战:60# 视频演示如何用纯 CSS 创作一块乐高积木
  9. 等价类、边界值的概念及划分
  10. 利用webpack和vue实现组件化