当前位置: 首页 > 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.lryc.cn/news/598144.html

相关文章:

  • 数据挖掘顶刊TKDE论文分享│ST-LLM+:面向交通预测的图增强时空大语言模型
  • 第五章 Freertos物联网实战 微信小程序篇
  • 从0开始学习R语言-Day56--空间变系数模型
  • Django基础(八)———数据库外键及表关系
  • Transformer Masked loss原理精讲及其PyTorch逐行实现
  • Kubernetes 集群架构和Pod创建流程
  • 【unity游戏开发入门到精通——组件篇】unity的粒子系统力场 (Particle System Force Field)实现如旋风、吸引力、风吹效果等
  • Unity GC 系列教程第四篇:GC Alloc 优化技巧与实践(下)与 GC 调优
  • 时序数据库IoTDB的核心功能特性
  • iOS WebView 加载失败与缓存刷新问题排查实战指南
  • 【Lucene】文件概览
  • 3D Semantic Occupancy Prediction
  • Linux进程生命周期:从创建到回收的完整闭环
  • 【建模与仿真】融合共现网络特征与知识增强语义梯度提升电子邮件分类
  • Jenkins最新版本的安装以及集成Allure生成测试报告
  • 跨越学术边界的战略选择:英文专著的潜在价值发掘
  • C++11之可变参数模板
  • 不同类型的交易所交易规则有哪些区别?
  • Apache Flink 实时流处理性能优化实践指南
  • Spring中的循环依赖:解密、破局与架构启示
  • 视频二维码在产品设备说明书中的应用
  • AI 在金融:重塑金融服务的智能革命
  • markdown学习笔记(个人向) Part.2
  • ESP-NOW无线通信协议:物联网设备间的高效对话方式
  • Effective Modern C++ 条款16:保证const成员函数的线程安全性
  • 字节的机器人模型 GR-3
  • 时间日期选择器组件进行日期和时间的禁用处理逻辑
  • vue3 el-table 列数据合计
  • 深入浅出 IO 多路复用:用 Java NIO 打造高性能网络应用
  • Redis的Pipeline