Linux 进程间通信——有名管道和无名管道

news2024/10/5 18:28:37

一、管道的概念

当从一个进程连接数据流到另一个进程时,我们使用管道。通常把一个进程的输出通过管道连接到另一个进程的输入。

管道可以用来在两个进程之间传递数据,如: ps -ef | grep “bash”, 其中‘|’就是管道,其作用就是将ps命令的结果写入管道文件,然后grep再从管道文件中读出该数据进行过滤。

用一个普通文件也可以达到进程间通信,但是效率太低了。普通文件存放在磁盘或者硬盘,性能比较低。管道类型的文件是存放在内存中的,关机之后管道在内存中分配的空间也就没有了,只在进程临时通信的时候使用,管道文件的打开必须至少有一个进程在读文件并且有一个进程在写文件。并且对于管道文件必须是以只读或只写的方式打开。

进程间的通信方式有3种:单工、半双工和全双工。
管道的通信方式是半双工。

二、有名管道

有名管道可以在任意两个进程之间通信 。创建的管道文件其实是在内存中分配了一块空间,向管道中写入的数据实际上写入了内存,所以管道文件的大小永远为0。

有名管道的创建:
mkfifo FIFO//创建一个名为FIFO的管道文件

1. 创建一个管道文件fifo

创建一个有名管道fifo,read.c文件负责向管道文件fifo中读取数据,write.c文件负责向管道文件fifo中写入数据。

在这里插入图片描述

2. 打开管道文件fifo

(1)如果对管道文件进行只读操作,或者只写操作,进程就会被阻塞,必须读和写同时进行:

write.c文件的代码如下:

在这里插入图片描述

read.c文件的代码如下:

在这里插入图片描述

编译并运行write和read程序,结果如下:

在这里插入图片描述
由结果可以看出:

只执行read文件向管道文件读数据时,进程发生阻塞,这个阻塞是在read.c文件中open打开管道文件的位置发生的。同理,只执行write文件向管道文件写入数据时,进程也会发生阻塞,这个阻塞同样也是在write.c文件中open打开管道文件的位置发生的。

(2)以读和写操作同时打开管道文件fifo

打开两个终端,两个终端分别执行write和read程序,此时就可以成功打开管道文件fifo:

在这里插入图片描述

3. 向管道文件中写入数据并读取数据

(1)向管道文件fifo中写入一次数据并读取

write.c文件的代码如下:

在这里插入图片描述

read.c文件的代码如下:

在这里插入图片描述

打开两个终端,两个终端分别执行write和read程序,此时就可以成功打开管道文件fifo:

在这里插入图片描述
此时read程序执行到了read的位置被阻塞住,在等待读数据,因为管道文件fifo中现在没数据。而write程序执行到了fgets的位置在等待从键盘输入数据。

接下来write程序向管道文件fifo中写入数据,read程序就可以读到写入管道文件fifo中的数据:

在这里插入图片描述

(2)可以连续向管道文件fifo中写入数据并读取数据:

对于管道文件来说,如果写入管道文件的程序关闭了,那么读管道文件的程序就会返回0,解除阻塞;如果读管道文件的程序关闭了,那么写入管道文件的程序就会产生异常(SIGPIPE)。

write.c文件的代码:

在这里插入图片描述

read.c文件的代码如下:

在这里插入图片描述

打开两个终端,两个终端分别执行write和read程序,此时就可以成功打开管道文件fifo,可以连续向管道文件中写入数据并且读取数据:

在这里插入图片描述

三、无名管道

无名管道主要应用于父子进程间的通信。 父进程可以通过管道进行数据的读取和写入,子进程也可以通过管道进行数据的读取和写入。如果父进程向管道中写入数据,子进程向管道中读取数据,那么父进程就把读端关闭,子进程就把写端关闭;相反父进程向管道中读取数据,子进程向管道中写入数据,那么父进程就把写端关闭,子进程就把读端关闭。这样才能形成一个单向的数据流。

无名管道的创建是通过pipe来创建:
在这里插入图片描述
其中:
pipe()如果成功返回0,失败则返回-1;
fds[0]是管道读端的描述符
fds[1]是管道写端的描述符

无名管道没有名字,它只能通过将文件描述符复制给子进程,然后让父子进程进行通信。

1. 无名管道的创建与应用

创建一个无名管道,父进程父进程向管道中写入数据,子进程向管道中读取数据。

代码如下:
在这里插入图片描述
【注意】先要将管道创建成功,这样才会有文件描述符。

运行结果:

在这里插入图片描述

四、总结

1.无论有名还是无名,写入管道的数据都在内存中
2.管道是一种半双工通信方式(通信方式有单工、半双工、全双工)
3.有名和无名管道的区别是有名管道可以在任意进程间使用,而无名管道主要在父子进程间通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/894095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CH32V203 单片机 I2C 使用

CH32V203系列是基于32位RISC-V内核设计的工业级增强型低功耗通用微控制器,高性能,最高支持144MHz系统主频,低功耗,运行功耗低至45uA/MHz。CH32V203集成双路USB接口,支持USB Host主机及USB Device设备功能,具…

[NAS4]Tiny adversarial multi-objective one-shot neural architecture search

论文链接:https://arxiv.org/abs/2103.00363v1 代码链接: 摘要:移动设备中广泛使用的微小神经网络(TNN)容易受到对抗性攻击,对TNN鲁棒性的更先进研究需求也越来越大。 本文关注于如何在不损失模型精度的…

【win7Window】高仿Windows7系统窗体

特性&#xff1a; 任意拖拽到边界可以最大化、半屏放大双击边界可以水平、纵向最大化可以拖拽四边、四个顶点调整窗体尺寸可以最大化、还原、最小化、关闭支持双击标题栏最大化、还原支持双击左上角图标关闭窗体 win7Window源码 <template><div :class"$options…

JS的解析与Js2Py使用

JS的解析与Js2Py使用 JS的解析事件监听器搜索关键字请求关联JS文件 Js2PyJs2Py的简单使用安装Js2Py执行JavaScript代码调用JavaScript函数 Js2Py的应用示例创建JavaScript文件使用JavaScript JS的解析 在一个网站中&#xff0c;登录密码通常是会进行加密操作的&#xff0c;那么…

LeetCode--HOT100题(34)

目录 题目描述&#xff1a;94. 二叉树的中序遍历&#xff08;简单&#xff09;题目接口解题思路1代码解题思路2代码 PS: 题目描述&#xff1a;94. 二叉树的中序遍历&#xff08;简单&#xff09; 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 LeetCode做…

el-table根据容器大小自适应滚动条-修改滚动条样式

需求&#xff1a;父容器里有多个容器为上下级&#xff0c;之后浏览器在缩放的时候&#xff0c;上面容器高度改变了&#xff0c;所以el-table被挤压&#xff0c;如果el-table设置的是固定的高度&#xff0c;那么挤压后内容超出父容器&#xff0c;本文章就是解决这个问题 不自适…

拒绝无效内卷!新同事靠着这套大屏模板效率翻倍,搭上升职快车!

竞争是职场永恒的话题&#xff0c;太多人为了升职加薪卷生卷死&#xff0c;就拿我自己身边来说&#xff0c;这段时间我所在的小组有一个升职机会&#xff0c;好多老员工为了这个机会争得头破血流&#xff0c;一个在公司待了10年的老员工&#xff0c;直接天天加班到12点&#xf…

蓝牙耳机的发展

目录 1.蓝牙耳机的概念 2.蓝牙耳机的发展过程 3.蓝牙耳机的便利性 4.蓝牙耳机未来的发展趋势 1.蓝牙耳机的概念 蓝牙耳机是一种使用蓝牙无线技术连接到音频源设备&#xff08;如智能手机、平板电脑、电脑等&#xff09;的耳机。它们通过无线蓝牙信号接收音频数据&#xff0c…

MybatisPlus的使用

一. 关于注解的使用&#xff0c;官方地址&#xff1a; 注解 | MyBatis-PlusMyBatis-Plus 官方文档https://baomidou.com/pages/223848/#tablename 1.关于TableName的使用 假设我们不加TableName("tbl_employee")的话&#xff0c;那么数据库中的表名和类名相同的话&…

Qt下拉菜单

1&#xff0c;QComboBox 2&#xff0c;setMenu()---设置下拉菜单 AI对话未来丨智能写作对话: setMenu()是QWidget类的一个成员函数&#xff0c;在Qt中用于将一个菜单作为一个控件的下拉菜单设置。具体来说&#xff0c;它会把相应的菜单对象与该控件关联&#xff0c;并在控件上…

Mysql8.0为什么取消了缓存查询的功能

首先我们介绍一下MySQL的缓存机制 【MySQL缓存机制】简单的说就是缓存sql文本及查询结果&#xff0c;如果运行完全相同的SQL&#xff0c;服务器直接从缓存中取到结果&#xff0c;而不需要再去解析和执行SQL。 但如果表中任何数据或是结构发生改变&#xff0c;包括INSERT、UPD…

问道管理:放量打拐什么意思?常见的放量打拐三种形态?

成交量一直是股票交易中比较重要的目标&#xff0c;那么&#xff0c;放量打拐是什么意思&#xff1f;常见的放量打拐三种形状是什么&#xff1f;下面问道管理为我们预备了相关内容&#xff0c;以供参阅。 放量打拐什么意思&#xff1f; 放量是指股票成交量与前几个交易日比较显…

隐私文件夹怎么加密?隐私文件夹加密方法

在个人电脑中&#xff0c;我们经常会将一些个人隐私存放在电脑文件夹中&#xff0c;这些文件夹都需要加密保护。那么&#xff0c;隐私文件夹该怎么加密呢&#xff1f;下面我们就来了解一下吧。 超级秘密文件夹 隐私数据存放在文件夹中&#xff0c;最怕的就是被其他人发现。而如…

迅镭激光中标全球集装箱行业龙头中集集团10家子公司集采项目!

迅镭激光中标喜报频传!继连续中标工程机械、钢构、船舶、电力电气、新能源等多个行业龙头企业后&#xff0c;近日再次中标全球集装箱行业龙头中集集团(CIMC)&#xff0c;这与迅镭激光坚持高端、注重技术引领、十五年的技术沉淀和口碑积累密不可分。 日前&#xff0c;中集集团20…

如何使用ChatGPT创作一个小说式的虚构的世界

世界构建也许是小说写作中最重要的一环&#xff0c;但也可能非常耗时。让ChatGPT加快这一过程吧。 写小说最棒的一点就是有机会从零开始创造一个新世界。你可以创造超凡脱俗的景观&#xff0c;赋予人物魔法。神话故事可以存在于你小说中的现实世界&#xff0c;而传统可以帮助你…

gazebo仿真ros2两轮差速小车没有控制的情况下缓慢移动后退

最近在做一款2轮差速的机器人小车&#xff0c;在做gazebo仿真的时候&#xff0c;发现小车一直在缓慢的后退&#xff0c;一边后退一边缓慢拐弯。 环境&#xff1a;ros2 foxy gazebo-11 小车xacro模型代码 <?xml version"1.0"?> <robot name"jtb…

华为OD机试 - 查找接口成功率最优时间段 - 回溯(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

【图书推荐 | 测试】—《测试设计思想》

前言 随着科技的不断发展&#xff0c;互联网的不断进步&#xff0c;日益出现了一种趋势&#xff1a;测试设计将成为一种跨领域的综合性工作&#xff0c;测试者将成为一种跨领域的通用型人才。由此清华大学出版社推出了一本名为《测试设计思想》的书籍&#xff0c;由知名专家周…

分析Flink,源和算子并行度不一致时,运行一段时间后,看似不再继续消费的问题,提供解决思路。

文章目录 背景分析 问题来了比较一开始的情况解决方式 背景 之前有分析过一次类似问题&#xff0c;最终结论是在keyby之后&#xff0c;其中有一个key数量特别庞大&#xff0c;导致对应的subtask压力过大&#xff0c;进而使得整个job不再继续运作。在这个问题解决之后&#xff…