以下内容源于朱有鹏《物联网大讲堂》的课程学习整理,如有侵权,请告知删除。

1、为什么需要exec函数?

(1)fork子进程是为了执行新程序

  • fork创建子进程后,子进程和父进程同时被OS调度执行;
  • 因此子进程可以独立地执行一个程序,这个程序宏观上将会和父进程程序同时进行。

(2)可以直接在子进程的if(){ }中写入新程序的代码

  • 但是这样不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码太长了也不好控制);
  • 譬如说我们希望子进程来执行ls -la 命令就不行了(因为没有源代码,只有编译好的可执行程序)。

(3)使用exec族运行新的可执行程序

  • exec族函数可以直接把一个编译好的可执行程序直接加载运行。

(4)有了exec族函数后,典型的父子进程程序如下

  • 首先项目是一个多进程项目;
  • (子进程需要运行的)程序被单独编写、单独编译连接成一个可执行程序(叫hello);
  • 主程序为父进程,fork创建子进程后,在子进程中使用exec来执行hello;
  • 这样就达到了父子进程分别运行不同程序,但(宏观上)同时运行的效果。

2、exec族的6个函数介绍

(1)execl和execv

  • 这两个函数是最基本的exec,都可以用来执行一个程序,区别是传参的格式不同。
  • execl是把参数列表(本质上是多个字符串,必须以NULL结尾)依次排列而成(l其实就是list的缩写)。
  • execv是把参数列表事先放入一个字符串数组中,再把这个字符串数组传给execv函数。

(2)execlp和execvp

  • 这两个函数在上面2个基础上加了p
  • 上面2个执行程序时必须指定可执行程序的全路径(如果exec没有找到path对应的文件则直接报错)。
  • 这里加了p的两个函数,传递的可以是file,也可以是path,只不过兼容了file。
  • 这两个函数会首先去找file,如果找到则执行执行,如果没找到则会去环境变量PATH所指定的目录下去找,如果找到则执行,如果没找到则报错。

(3)execle和execvpe

  • 这两个函数较基本exec来说加了e,函数的参数列表中也多了一个字符串数组envp形参;
  • e表示environment(环境变量),和基本版本的exec的区别在于,执行可执行程序时会多传一个环境变量的字符串数组给待执行的程序。

3、execl和execv实战

(1)使用execl运行ls -l -a

(2)使用execv运行ls

(3)使用execl运行自己写的程序

4、execlp和execvp实战

  • 不加p时需要全部路径+文件名,如果找不到就报错了。
  • 加了p之后会到PATH所指定的路径下去找一下。

5、execle和execvpe实战

(1)main函数的原型其实不止是int main(int argc, char **argv),而可以是

  • int main(int argc, char **argv, char **env)第三个参数是一个字符串数组,内容是环境变量。
#include <stdio.h>// env就是我们给main函数额外传递的环境变量字符串数组
int main(int argc, char **argv, char **env)
{int i = 0;printf("argc = %d.\n", argc);while (NULL != argv[i]){printf("argv[%d] = %s\n", i, argv[i]);i++;}i = 0;while (NULL != env[i]){printf("env[%d] = %s\n", i, env[i]);i++;}return 0;
}

(2)如果用户在执行这个程序时没有传递第三个参数,则程序会自动从父进程继承一份环境变量(默认的,最早来源于OS中的环境变量);

  • 如果使用execlp或者execvpe去传递一个envp数组,则程序中的实际环境变量是我们传递的这一份(取代了默认的从父进程继承来的那一份)
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>int main(void)
{pid_t pid = -1;pid_t ret = -1;int status = -1;pid = fork();if (pid > 0){// 父进程printf("parent, 子进程id = %d.\n", pid);}else if (pid == 0){// 子进程//execl("/bin/ls", "ls", "-l", "-a", NULL);       // ls -l -a//char * const arg[] = {"ls", "-l", "-a", NULL};//execv("/bin/ls", arg);//execl("hello", "aaa", "bbb", NULL);//char * const arg[] = {"aaa", "bbb", NULL};//execv("hello", arg);//execlp("ls", "ls", "-l", "-a", NULL); char * const envp[] = {"AA=aaaa", "XX=abcd", NULL};execle("hello", "hello", "-l", "-a", NULL, envp);return 0;}else{perror("fork");return -1;}return 0;
}

Linux进程全解8——exec 族函数相关推荐

  1. linux应用编程和网络编程-3.4.linux进程全解- 父子关系 exec system函数

    程序的开始和结束 编译链接时的引导代码(构建执行环境)调用main函数 ①编译链接时的链接器:将编译器中引导代码给连接进去和应用程序一起构成最终的可执行程序. ②运行时的加载器:将这个程序加载到内存中 ...

  2. Linux进程全解1——程序的开始、结束

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 1.main函数由谁调用? (1)编译链接时的引导代码 操作系统下的应用程序,在main函数执行前,需要先执行一段 ...

  3. Linux系统【二】exec族函数及应用

    文件描述符 文件描述符表是一个指针数组,文件描述符是一个整数. 文件描述符表对应的指针是一个结构体,名字为file_struct,里面保存的是已经打开文件的信息 需要注意的是父子进程之间读时共享,写时 ...

  4. Linux进程全解11——进程间通信(IPC)概述

    以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 1.为什么需要进程间通信? (1)进程间通信(IPC) 指的是2个任意进程之间的通信. (2)同一个进程在一个地址 ...

  5. Linux进程全解9——进程状态、system函数、进程间的关系

    以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 1.进程的5种状态 (1)就绪态 这个进程当前所有运行条件就绪,只要得到CPU时间就能直接运行. (2)运行态 就 ...

  6. Linux进程全解10——守护进程

    以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 一.守护进程介绍 1.进程查看命令ps ps -ajx偏向显示各种有关的ID号: ps -aux偏向显示进程各种占 ...

  7. Linux进程全解12——lIPC机制之管道,SystemV IPC介绍

    以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 一.管道 1.管道(无名管道) (1)管道通信的原理:内核维护的一块内存,有读端和写端(管道是单向通信的): (2 ...

  8. Linux进程全解7——父进程wait / waitip回收子进程

    以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 一.wait介绍 1.wait的工作原理 (1)子进程结束时,系统向其父进程发送SIGCHILD信号: (2)父进 ...

  9. Linux进程全解6——进程的诞生和消亡

    以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 1.进程的诞生 (1)进程0和进程1 进程0,是操作系统在启动过程中,由内核一点点构建起来: 内核态下的进程1,是 ...

最新文章

  1. 移动互联网的创新与91生态
  2. sdut-1148 相加和最大值
  3. 微信小程序接入腾讯地图sdk地图 用户自选位置。踩坑+代码实现
  4. log_miner操作(日志挖掘)
  5. vim 分屏 最大化_Vim的分屏功能命令大全
  6. 关于总结记录的一点体会
  7. 【重识 HTML + CSS】元素类型、display、visibility、overflow
  8. 使用rpm命令卸载程序
  9. 2021-04-02
  10. Flutter安装依赖包
  11. JS根据城市名称获取所在省份
  12. 大众点评字体解密(最新)2020/4/17
  13. Linux下为空白SD卡建立BOOT,rootfs分区
  14. 【题解】洛谷P1661扩散(同LibreOJ10015) 曼哈顿距离最小生成树
  15. HBuilder开发App
  16. 莆田家庭教育指导师证在哪报名报考条件是什么
  17. 速算24点(C++)
  18. 教育技术(Educational technology)学习分析和教育数据挖掘领域的SCI、SSCI、CSSCI期刊与会议
  19. ios快捷指令:一键登录/登出南京大学校园网
  20. 工业嵌入式计算机系统介绍

热门文章

  1. 剑指Offer-正则表达式匹配(Python)
  2. 3530: [Sdoi2014]数数
  3. ThreadLocal的练习代码
  4. Sublime 的中文乱码问题
  5. GUN/LINUX命令之 cp mv install
  6. 树形列(无限级联下拉列的曲线版本)
  7. WPF 使用皮肤影响按钮自定义
  8. mysql备份还原(视图、存储过程)
  9. java 双重检查加锁弊端
  10. Linux驱动开发必看详解神秘内核(完全转载)