当前位置: 首页 > news >正文

Linux应用开发基础知识——进程学习2(exec函数、system函数、popen函数)(三)

目录

一、exec函数

1.exec族函数函数的作用:

2.exec族函数定义:

3.execl函数代码示例:​编辑​编辑

二、system函数

1. 函数原型:

2. 小试验:

三、popen函数

1. 函数原型:

2. 小试验:


一、exec函数

1.exec族函数函数的作用:

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

2.exec族函数定义:

功能:
  在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。
函数族:
  exec函数族分别是:execl, execlp, execle, execv, execvp, execvpe
函数原型:
在这里插入图片描述
返回值:
  exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。
参数说明:
path:可执行文件的路径名字
arg:可执行程序所带的参数,第一个参数为可执行文件名字,没有带路径且arg必须以NULL结束
file:如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,在它所指定的各目录中搜寻可执行文件。

exec族函数参数极难记忆和分辨,函数名中的字符会给我们一些帮助:
l : 使用参数列表
p:使用文件名,并从PATH环境进行寻找可执行文件
v:应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。
e:多了envp[]数组,使用新的环境变量代替调用进程的环境变量

3.execl函数代码示例:
在这里插入图片描述
在这里插入图片描述


运行结果:
在这里插入图片描述
运行结果显示,成功使用exec函数后,后面关于Yes的打印就不执行了!
这个是execl函数与system函数的重要区别!

与直接运行了man函数是一样的,只不过是参数不同
直接运行man.c:
在这里插入图片描述

二、system函数

1. 函数原型:

在这里插入图片描述
关于system函数内部的代码内容:
在这里插入图片描述
可见里面使用了exec族函数,文件路径为bin目录下的bin目录下的sh文件,文件名为sh,参数为-c,在虚拟机中,我们可以探究一下sh -c 有什么用?
在这里插入图片描述
发现使用sh -c ./man和./man都实现了同样的功能,执行文件./+可执行文件,在其前面加sh -c 也是如此,由此可得,system函数就是执行cmdstring,只要将“./+可执行文件名”传入即可!
在这里插入图片描述

2. 小试验:

man函数与前面man函数一样
在这里插入图片描述
运行结果:
从运行结果就可以看出system函数和exec函数的区别,成功使用system函数后,其后面的关于Yes的打印依然执行!
在这里插入图片描述

三、popen函数

1. 函数原型:

在这里插入图片描述
函数好处:可以获取运行的输出结果
参数说明:
  command: 是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。

mode: 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。

返回值:
  如果调用成功,则返回一个读或者打开文件的指针,如果失败,返回NULL,具体错误要根据errno判断

int pclose (FILE* stream)
  参数说明:
  stream:popen返回的文件指针
  返回值:
  如果调用失败,返回 -1

作用:
  popen() 函数用于创建一个管道:其内部实现为调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程这个进程必须由 pclose() 函数关闭。

2. 小试验:

在这里插入图片描述
运行结果:
在这里插入图片描述
与直接使用sh -c ps运行的现象是一样的
直接使用:
在这里插入图片描述
这里使用popen函数并不会将代码中运行的程序的输出结果输出出来,而是将其收进一个“管道”内,上面实验输出了结果是因为使用了printf函数将其打印出来!
删除printf函数后现象(注释了printf):
在这里插入图片描述
运行结果:
可以看到啥都没有!
在这里插入图片描述

http://www.dtcms.com/a/296759.html

相关文章:

  • C语言:20250724笔记(函数-指针)
  • S7-200 SMART 编程基础详解:从语言、数据结构到寻址方式
  • Spring Bean生命周期七步曲:定义、实例化、初始化、使用、销毁
  • C语言(十)
  • 面试150 寻找峰值
  • Leetcode-.42接雨水
  • 【Linux基础知识系列】第六十四篇 - 了解Linux的硬件架构
  • 【学习】数字化车间与智能工厂如何推进制造业转型
  • 放款需要注意的事项
  • C++实战:人脸识别7大核心实例
  • 【Java】空指针(NullPointerException)异常深度攻坚:从底层原理到架构级防御,老司机的实战经验
  • 网络测试工具
  • UE 加载本地Json文件
  • 【Servo】裸机还是RTOS驱动架构如何选?
  • C++核心编程学习--对象特性--对象的初始化和清理
  • MCU(微控制器)中的高电平与低电平?
  • 基于LiteOS的OTA组件实现对终端固件的差分升级和全量升级
  • Rust与YOLO目标检测实战
  • 【redis其它面试问题】
  • 【OD机试】矩阵匹配
  • JavaScript高级特性与优化全解析
  • JManus Plan-Act模式:如何对用户的需求进行规划和执行
  • 【第五节】列表渲染
  • p5.js 椭圆的用法:从基础到创意应用
  • Java 实现 B/S 架构详解:从基础到实战,彻底掌握浏览器/服务器编程
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十九天-模拟面试前
  • 前端学习日记(十二)
  • MongoDB常用场景
  • jax study notes[19]
  • 【Kubernetes】通过 YAML 创建 nginx Pod 并验证,流程总结