函数能力:“换核不换壳”(能够替换进程虚拟地址空间中.text 代码段)。
作用:让父子进程执行不相干的操作。
效果:有一个运行的程序 A,在 A 中调用另一个程序 B,程序有父子进程,父进程实现 A 的原有功能,子进程通过 exec,调用程序B。
注:exec 使用之前,一般需要 fork()。
execl 函数:
(1)

int execl(const char *path, const char *arg, ..., NULL);// execl 一般调用自定义程序, path是要执行程序的路径(建议使用绝对路径),用于寻找程序;arg是第一个占位(一般写要执行程序的名字),后面是要执行程序的参数。最后一个参数 NULL 作为结束(因为变参,系统不知道变参数量,因此需要结束标志)

(2)

 int execlp(const char *file, const char *arg, ..., NULL);// execl 一般调用系统自带的应用程序,与上个函数基本相同,唯一不同点在参数 1:程序名称,不需要指定路径,因此一般调用系统命令

指定的路径的目的是为了寻找到被调用的命令,这里并不是不需要路径,而是路径已经指定好了,就是环境变量 PATH 指向的路径,系统会在其中自动寻找。
在 exec 调用失败后作错误输出的代码如下:

pid_t pid = fork();
if(pid == 0)
{int ret = execlp(“ps”, “ps”, “aux”, NULL); // 调用失败,返回值为-1,但此处不需要条件判断,再作错误输出// 如果成功,根本不会执行 perror,因为所有代码先会被删除,再替换为 ps
// 失败,上句等价于 int ret = -1,然后继续向下执行 perror
perror(“execl err”);
exit(1);
}
if(pid > 0)
{…………..
}

exec 虽然有返回值 ret,但没有用:
如果函数执行成功,不返回(因此源代码已经被替换掉了)。
如果执行失败,打印错误信息,退出当前操作。

Linux学习之系统编程篇:exec 函数族相关推荐

  1. Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式

    一.ps 和 kill 命令 1.ps 命令 常用方式: ps aux :查看正在运行进程信息(主要查 pid). ps ajx :更加详细(PID. PPID:父进程 id. PGID:进程组 id ...

  2. Linux学习之系统编程篇:对线程的基本认识

    (1)fork()后创建的子进程是父进程的拷贝,那么pthread_create,创建线程,创建的线程跟原进程有什么关系呢? fork 会通过拷贝产生新的虚拟地址空间(PCB 会变化),而 pthre ...

  3. Linux学习之系统编程篇:编写一个守护进程

    需求:写一个守护进程,每隔 2s 获取一次系统时间,将这个时间写入到磁盘文件 #include <stdio.h> #include <stdlib.h> #include & ...

  4. Linux学习之系统编程篇:守护进程(精灵进程、后台进程)

    一.背景 一般情况下,启动终端(shell),系统会创建一个会话(shell 进程是会长),经过后续各种操作,该会话中会存在多个进程组,每个进程组中也会有多个进程(父进程是组长),若此时关闭 shel ...

  5. Linux学习之系统编程篇:shm 共享内存及其操作函数

    一.shm 和 mmap 的区别 (1)mmap 是在磁盘上建立一个文件,每个进程地址空间中开辟出一块空间进行映射.shm 每个进程最终会映射到同一块物理内存.shm 保存在物理内存,这样读写的速度最 ...

  6. Linux学习之系统编程篇:利用管道进行进程间通信

    这里我们先补充一个小知识: 父子进程使用 pipe 进行通信时fork 和 pipe 先后的顺序是先 pipe,后 fork,因为父进程先创建管道,再 fork 创建子进程,这样才能是父子进程共享一块 ...

  7. Linux学习之系统编程篇:IPC 和管道的基本概念及管道的创建

    一.IPC 概念 IPC: 进程间通信. 进程间通信的常见的 4 中方式: (1)管道 pipe fifo :最简单(但只能在有血缘关系下进行). (2)信号 signal : 属于系统的,所以系统开 ...

  8. Linux学习之系统编程篇:MMU(Memory Manager Unit 内存管理单元)

    一.虚拟内存地址 对应于上图的两端,其中 0 - 3G 是用户区 ,3 - 4G 是内核区.编码的内存地址都是虚拟地址. 在3G到4G之间是PCB 进程控制块.从3G到0依次为: (1)命令行参数 和 ...

  9. Linux学习之系统编程篇:使用信号量实现“生产者和消费者模型”

    模型中,最为关键的步骤是,在生产者回调函数中,未生产之前,消费者回调函数是阻塞的,阻塞方式是条件变量. 那么不使用条件变量,如何使用"信号量"实现阻塞呢? 答案是因为调用 sem_ ...

最新文章

  1. [转] 使用Spring MVC构建REST风格WEB应用
  2. centos7防火墙操作
  3. mysql的联表查询和去重复数据
  4. win7系统还原失败怎么解决
  5. 搭建顶级域名下的个人博客网站
  6. jQuery.each方法
  7. Android中文URL乱码问题 解决
  8. 合沟微服务怎么添加_如何在微服务中使用webservice?
  9. java boolean 大小_Java 中 boolean 类型占用多少个字节 [MD]
  10. CRC校验 与 模2运算
  11. html5 中的 wbe storage
  12. Sobel边缘检测算子OpenCV实现
  13. 充分统计(sufficient statistic) 理解
  14. 论文阅读 [TPAMI-2022] Deep Visual Odometry With Adaptive Memory
  15. pda通用扫描app_uni-app 如何调用PDA扫描?广播模式的调用??有什么办法吗?
  16. linux查看服务器防火墙策略,linux防火墙的策略规则
  17. 468、Java框架122 -【Spring + SpringMVC + MyBatis - JSON】 2021.01.27
  18. 第一章:计算机的软硬件基本结构_3
  19. Storm集成HBase、JDBC、Kafka、Hive测试
  20. 通过IP查找ip所对应网卡名

热门文章

  1. 2020-2-15技术积累-时间插件-前端获取后端数据生成表格
  2. 零样本性能超越GPT-3!谷歌提出1370亿参数自回归语言模型
  3. 将图卷积神经网络用于解码分子生成
  4. [PAMI2013] Guided Image Filtering 导向滤波器以及OpenCV-Python代码实现
  5. Java 实现 Trie (前缀树)
  6. window中osmnx包的详细安装过程
  7. mysql 1067 42000_MySQL:ERROR 1067 (42000): Invalid default value for 'end_time'
  8. SpringAOP中通过JoinPoint获取值,并且实现redis注解
  9. MySql分表、分库、分片和分区知识(转载)
  10. Vue——Windows 10下Vue项目启动步骤[vue-cli-service启动版本]