管道-匿名管道
一、管道介绍
管道(Pipe)是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入,从而实现数据的流动。管道是一种轻量级的通信方式,用于协调不同进程的工作。
1. 创建和使用管道:
- 创建: 管道可以通过在Shell命令中使用竖线符号
|
来创建,也可以在程序中使用系统调用pipe
来创建。- 使用: 管道通过将一个进程的标准输出(stdout)连接到另一个进程的标准输入(stdin),从而实现两者之间的数据传输。
- 2. 匿名管道:
- 类型: 管道分为匿名管道(Anonymous Pipe)和命名管道(Named Pipe)。
- 匿名管道: 由操作系统动态创建,用于具有亲缘关系的进程之间的通信,其句柄仅在创建时有效。
- 3. 命名管道(FIFO):
- 类型: 命名管道是一种特殊的文件,也称为FIFO(First In, First Out)。
- 命名: 在文件系统中具有唯一名称,不限于亲缘关系的进程,可以在不同进程之间共享数据。
- 4. 进程间通信(IPC):
- 目的: 管道用于实现进程间通信,允许一个进程的输出成为另一个进程的输入。
- 特点: 管道是半双工的,数据流只能单向传输,需要两个管道来实现双向通信。
- 5. Shell中的管道:
- 语法: 在Shell中,使用
|
将一个命令的输出传递给另一个命令,形成管道。- 示例:
ls | grep "pattern"
,这会将ls
的输出传递给grep
进行过滤。- 6. 程序中的管道:
- 系统调用: 在C语言等编程语言中,可以使用
pipe
系统调用创建管道,使用dup2
复制文件描述符,最后使用exec
执行其他程序。- 7.关闭和错误处理:
- 关闭: 使用管道时,需要确保在合适的时候关闭不需要的文件描述符,以避免资源泄漏。
- 错误处理: 对于管道的创建和使用,需要进行错误处理,以处理可能发生的异常情况。
- 8.限制和注意事项:
- 有限性: 管道的缓冲区有限,可能导致阻塞,特别是在没有足够空间来容纳数据时。
- 同步问题: 管道的使用可能涉及到进程间的同步问题,需要谨慎处理。
ls |wc -l
这是一种典型的使用匿名管道的情况,用于连接两个进程,其中一个进程的输出成为另一个进程的输入。在这里,ls
命令用于列出目录中的文件,而wc -l
命令则用于统计行数,因此可以用于统计目录中文件的数量。
二 、管道特点
-
内核内存中的缓冲器:
- 管道是在内核内存中维护的缓冲器,用于在两个进程之间传递数据。这个缓冲器是有限的,因此管道的容量是有限的,当管道达到容量上限时,写操作可能会阻塞。
-
匿名管道与有名管道的特性:
- 匿名管道没有文件实体,它是通过系统调用
pipe
创建的。有名管道则是在文件系统中有唯一名称的文件,通过mkfifo
创建。有名管道可用于不同进程之间的通信,而匿名管道通常用于有亲缘关系的进程。
- 匿名管道没有文件实体,它是通过系统调用
-
管道的读写操作:
- 管道的读写操作与文件相似,可以使用标准的文件I/O操作,如
read
和write
。进程通过向管道写入数据,或从管道读取数据来进行通信。
- 管道的读写操作与文件相似,可以使用标准的文件I/O操作,如
-
消息边界的缺失:
- 与消息队列不同,管道是一个字节流,不存在消息边界的概念。进程可以读取任意大小的数据块,而不受写入数据块大小的限制。这种特性使得管道在流式数据传输场景中非常灵活。
-
数据的顺序性:
- 管道传递的数据是顺序的,即数据的读取顺序与写入顺序保持一致。这确保了在管道中传递的数据在接收端是按照正确的顺序被处理。
-
单向传递:
- 管道是单向的,即数据的传递方向是确定的。一端用于写入数据,另一端用于读取数据。这使得管道成为半双工的通信机制。
-
一次性读取:
- 从管道中读取数据是一次性的操作,即一旦数据被读取,它就从管道中被移除。这也意味着,如果某个进程没有读取所有写入管道的数据,这些数据将被丢弃。
-
无法随机访问:
- 与文件不同,管道中的数据不能通过
seek()
等操作进行随机访问。由于管道是一个流式的通信机制,数据只能按顺序读取。
- 与文件不同,管道中的数据不能通过
-
匿名管道的限制:
- 匿名管道通常限制在具有公共祖先的进程之间使用。这通常是父子进程之间的通信,或者通过其他方式具有亲缘关系的进程之间的通信。匿名管道是在
pipe()
系统调用时创建的。
- 匿名管道通常限制在具有公共祖先的进程之间使用。这通常是父子进程之间的通信,或者通过其他方式具有亲缘关系的进程之间的通信。匿名管道是在
三、 为什么可以使用管道进行进程间通信
在父子进程或兄弟进程之间使用匿名管道进行通信时,理解文件描述符表的概念是非常重要的。文件描述符表是每个进程内部维护的一张表,用于跟踪打开的文件和其他I/O资源。以下是匿名管道在进程间通信中与文件描述符表的关系:
-
文件描述符的创建:
- 当调用
pipe
系统调用创建匿名管道时,会返回两个文件描述符,这两个文件描述符分别代表管道的读端和写端。
- 当调用
-
父子进程之间的文件描述符继承:
- 在调用
fork
创建子进程时,子进程将会继承父进程的文件描述符表。这意味着子进程也会获得父进程的管道文件描述符。
- 在调用
-
关闭不需要的文件描述符:
- 通常,在使用管道进行通信时,需要关闭不需要的文件描述符。例如,在子进程中关闭管道的写端,在父进程中关闭管道的读端,以确保每个进程只使用它需要的文件描述符。
-
数据流动:
- 当一个进程向管道写入数据时,数据通过管道流向另一个进程。这是通过在一个进程中使用
write
,在另一个进程中使用read
来完成的,而这些操作使用文件描述符。
- 当一个进程向管道写入数据时,数据通过管道流向另一个进程。这是通过在一个进程中使用
四、管道的数据结构
五、 父子进程之间使用匿名管道通信
/*#include <unistd.h>int pipe(int pipefd[2]);功能:创建一个匿名管道,用来进程通信参数:int pipefd[2] 这个数组是一个传出参数pipefd[0] 对应管道的读端(文件描述符)pipefd[2] 对应管道的写端返回值:成功:0失败:-1注意: 匿名管道只能用于具有关系的进程之间的通信(父子进程、兄弟进程)*/#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
// 子进程发送数据给父进程,父进程输出
int main(){// 在fork之前创建管道int pipefd[2];int ret = pipe(pipefd);if(ret==-1){perror("pipe");exit(0);}// 创建子进程pid_t pid =fork();if(pid>0){printf(" i am a parent,pid : %d\n",getpid());char buf[1024]={0};while(1){//读int len = read(pipefd[0],buf,sizeof(buf));printf("parent recv :%s,pid: %d\n",buf,getpid());char * str ="heloo ,i am your parent";// 想管道写数据write(pipefd[1],str, strlen(str));sleep(1);}}else if(pid==0){//sleep(10);printf(" i am a child process, pid: %d\n",getpid());char buf[1024]={0};while (1){char * str ="heloo ,i am your grandfaher";// 向管道写数据write(pipefd[1],str, strlen(str));sleep(1);// 读int len = read(pipefd[0],buf,sizeof(buf));printf("parent recv :%s,pid: %d\n",buf,getpid());}}return 0;
}
六、fpathconf查看管道大小
fpathconf
是一个用于获取文件路径配置值(pathconf values)的函数。通过这个函数,可以获取与文件或文件描述符相关联的一些运行时配置信息,包括管道的大小。
要查看管道的大小,可以通过 fpathconf
函数来获取相应的配置值。对于管道的大小,我们关注的是 PIPE_BUF
,它表示一个原子的写入或读取操作的最大字节数。注意,PIPE_BUF
并不一定反映实际管道的大小,而是表示每次写入或读取的最大字节数,它是一个限制,不同系统可能有不同的值
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>int main(){int pipefd[2];int ret = pipe(pipefd);//获取管道大小long size = fpathconf(pipefd[0],_PC_PIPE_BUF);printf("pipe size : %ld\n",size);return 0;
}
相关文章:
管道-匿名管道
一、管道介绍 管道(Pipe)是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入,从而实现数据的流动。管道是一种轻量级的通信方式,用于协调不同进程的工作。 1. 创建和使用管道&#…...
【JavaEE基础学习打卡08】JSP之初次认识say hello!
目录 前言一、JSP技术初识1.动态页面2.JSP是什么3.JSP特点有哪些 二、JSP运行环境配置1.JDK安装2.Tomcat安装 三、编写JSP1.我的第一个JSP2.JSP执行过程3.在IDEA中开发JSP 总结 前言 📜 本系列教程适用于JavaWeb初学者、爱好者,小白白。我们的天赋并不高…...
使用序列到序列深度学习方法自动睡眠阶段评分
深度学习方法,用于使用单通道脑电图进行自动睡眠阶段评分。 def build_firstPart_model(input_var,keep_prob_0.5):# List to store the output of each CNNsoutput_conns []######### CNNs with small filter size at the first layer ########## Convolutionnetw…...
【算法】排序——选择排序和交换排序(快速排序)
主页点击直达:个人主页 我的小仓库:代码仓库 C语言偷着笑:C语言专栏 数据结构挨打小记:初阶数据结构专栏 Linux被操作记:Linux专栏 LeetCode刷题掉发记:LeetCode刷题 算法头疼记:算法专栏…...
Docker 容器监控 - Weave Scope
Author:rab 目录 前言一、环境二、部署三、监控3.1 容器监控 - 单 Host3.2 容器监控 - 多 Host 总结 前言 Docker 容器的监控方式有很多,如 cAdvisor、Prometheus 等。今天我们来看看其另一种监控方式 —— Weave Scope,此监控方法似乎用的人…...
Spring Boot集成redis集群拓扑动态刷新
项目场景: Spring Boot集成Redis集群,使用lettuce连接Cluster集群实例。 问题描述 redis其中一个节点挂了之后,springboot集成redis集群配置信息没有及时刷新,出现读取操作报错。 java.lang.IllegalArgumentException: Connec…...
COCI2022-2023#1 Neboderi
P9032 [COCI2022-2023#1] Neboderi 题目大意 有一个长度为 n n n的序列 h i h_i hi,你需要从中选择一个长度大于等于 k k k的子区间 [ l , r ] [l,r] [l,r],使得 g ( h l h l 1 ⋯ h r ) g\times (h_lh_{l1}\cdotsh_r) g(hlhl1⋯hr)最小&…...
由于找不到d3dx9_43.dll无法继续执行此代码怎么解决?全面解析d3dx9_43.dll
在使用计算机过程中,我们可能会遇到各种各样的问题。其中之一就是d3dx9_43.dll文件丢失的问题。这个问题通常会出现在运行某些应用程序或游戏时,导致程序无法正常启动或运行。那么,如何解决这个问题呢?小编将为您提供一些解决方案…...
Linux--网络编程-字节序
进程间的通信: 管道、消息队列、共享内存、信号、信号量。 特点:都依赖于linux内核。 缺陷:无法多机通信。 一、网络编程: 1、地址:基于网络,ip地址端口号。 端口号作用: 一台拥有ip地址的主机…...
python实现http/https拦截
python实现http拦截 前言:为什么要使用http拦截一、技术调研二、技术选择三、使用方法前言:为什么要使用http拦截 大多数爬虫玩家会直接选择API请求数据,但是有的网站需要解决扫码登录、Cookie校验、数字签名等,这种方法实现时间长,难度高。需求里面不需要高并发,有没有…...
农产品团购配送商城小程序的作用是什么
农产品覆盖稻麦油蛋等多种细分类目,各地区经营商家众多,随着人们生活品质提升,对食物的要求也在提升,绿色无污染无激素的农产品往往受到不少人喜爱,而在销售中,也有不少人选择自建商城线上经营。 通过【雨…...
使用van-dialog二次封装微信小程序模态框
由于微信小程序的wx.showModal不支持富文本内容,无法实现更灵活的展示效果,故需要进行二次封装 实现思路:使用van-dialog以及微信小程序的rich-text实现 代码如下: // index.wxml <van-dialoguse-slottitle"提示"s…...
生鲜蔬果同城配送社区团购小程序商城的作用是什么
生鲜蔬果行业作为市场主要支撑之一,从业商家众多的同时消费者也从不缺,尤其对中高城市,生鲜蔬果除了传统线下超市、市场经营外,线上更是受到大量消费者信任,而很多商家也是自建了生鲜蔬果商城多场景生意经营。 那么通…...
Unity实现设计模式——状态模式
Unity实现设计模式——状态模式 状态模式最核心的设计思路就是将对象的状态抽象出一个接口,然后根据它的不同状态封装其行为,这样就可以实现状态和行为的绑定,最终实现对象和状态的有效解耦。 在实际开发中一般用到FSM有限状态机的实现&…...
差分数组的应用技巧
前缀和技巧 针对的算法场景是不需要对原始数组进行修改的情况下,频繁查询某个区间的累加和。 差分数组 主要适用场景是频繁对原始数组的某个区间的元素进行增减。 相关题目 1094. 拼车 1109. 航班预订统计 370. 区间加法 # 1094. 拼车 class Solution:def carPool…...
斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 10 Mining Social-Network Graphs
来源:《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT。 Chapter 10 Mining Social-Network Graphs The essential characteristics of a social network are: There is a collection of entities that participate in the network. Typically, these entiti…...
DFS:842. 排列数字
给定一个整数 nn,将数字 1∼n1∼n 排成一排,将会有很多种排列方法。 现在,请你按照字典序将所有的排列方法输出。 输入格式 共一行,包含一个整数 nn。 输出格式 按字典序输出所有排列方案,每个方案占一行。 数据…...
pytorch之nn.Conv1d详解
自然语言处理中一个句子序列,一维的,所以使用Conv1d...
H5生成二维码
H5生成二维码: 1.引入js库,可自行点击链接复制使用 <script type"text/javascript" src"http://static.runoob.com/assets/qrcode/qrcode.min.js"></script>2.加入二维码占位区HTML <div id"qrCode">…...
Three.js加载360全景图片/视频
Three.js加载360全景图片/视频 效果 原理 将全景图片/视频作为texture引入到three.js场景中将贴图与球形网格模型融合,将球模型当做成环境容器使用处理视频时需要以dom为载体,加载与控制视频动作每次渲染时更新当前texture,以达到视频播放效…...
北大硕士7年嵌入式学习经验分享
阶段 1 大一到大三这个阶段我与大多数学生相同: 学习本专业知识(EE专业),学习嵌入式软件开发需要的计算机课程(汇编原理,计算机组成原理,操作系统,C语言等),…...
华为鸿蒙手表开发之动态生成二维码
华为鸿蒙手表开发之动态生成二维码 前言: 最近入职新公司,由于之前的哥们临时离职,走得很突然,所以没有任何交接和文档,临时顶上公司手表应用的上架,更换了新的密钥和key之后重新测试功能和流程ÿ…...
2023-09-28 monetdb-databae的概念和作用-分析
摘要: 每个数据库对于db,schema以及user,role都有一套自己的设计, 不同数据库间对于相同名字的东西例如database和schema可以说南辕北辙, 例如mysql中schema其实是database的同义词. 本文分析monetdb的database的概念和作用 database的概念和作用: 和mysql的database完全不同…...
2024级199管理类联考之数学基础(上篇)
管理类考试介绍 管理综合200分,时间3小时 数学:75分/25题,是拉开差距的核心模块 问题求解题:15个,5选一条件充分性判断:10个,结合两个条件选择答案 条件一充分,条件二不充分:A条件一不充分,条件二充分:B条件一充分,条…...
RFID技术引领汽车零部件加工新时代
RFID技术的兴起引领了汽车零部件加工领域的新时代,作为一种利用无线电频率进行自动识别的技术,RFID技术能够快速、准确地识别物体并获取相关数据,在汽车零部件加工中,RFID技术具有重要的应用价值,可以提高生产效率、降…...
python中使用matplotlib绘图
一、背景 当我们在写python程序时,不可避免的需要将数据可视化,也就是绘制出数据的曲线图,以便我们更直观的观察数据间的变化,和方便对比。此时就要用到matplotlib库了。 matplotlib官方给出的定义是: 翻译过来也就是…...
Qt Creator 使用技巧
使用技巧 功能快捷键解释Switch Header/SourceF4在同名的头文件和源程序文件之间切换Follow Symbol Under CursorF2变量:跳转到声明;函数:声明和定义切换Refactor Rename Symbol Under CursorCtrlShiftR改名称,将替换所有用到这个符号的地方RefactorAdd Definition…...
来看看双阶段目标检测算法趴
🚀 作者 :“码上有钱” 🚀 文章简介 :AI-目标检测算法 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬简介 双阶段目标检测算法是一类深度学习算法,通常分为两个阶段来检测和识别图像中的…...
python利用matplotlib绘图,对于中文和负号不显示,显示方框“口口”完美解决办法!!
文章目录 一、问题展示二、问题分析三、解决办法四、结果展示 一、问题展示 二、问题分析 可以发现对中文,以及负号不显示。 三、解决办法 import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [usimHei] # 显示中文 plt.rcParams[axes.unicode_mi…...
【数组及指针经典笔试题解析】
1.数组和指针笔试题 题目1 int main(){int a[5] { 1,2,3,4,5};int * ptr (int * )(&a 1);printf("%d,%d",*(a 1),*(ptr - 1));return 0;}图文解析: int * ptr …...
青岛网站设计哪家好/seoul是什么意思中文
state 1.类中方法this的指向 constructor和render里的this指向类组件的实例对象在类组件内部定义的普通函数,作为onClick的回调,不是通过实例调用的,是直接调用,并且类组件内部默认开启了局部严格模式,所以this指向u…...
做高端网站的公司/线下推广有哪些渠道
由于各种各样的原因,表格中出现了一些多余的空白行/空白列/空白单元格,怎样快速删除这些空白呢? 使用正则的来进行批量替换:^\n以换行符开头的信息替换成空。间接实现空行的删除。 替换成功后的效果:...
海南房产网站开发/广告推广方案怎么写
本文以一个现代的、实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度——延迟和数据吞吐量。通过粗略的估算PC各个组件的相对运行速度,希望能给大家留下一个比较直观的印象。本文中的数据来自…...
温州网站建设专业的公司/网络营销企业案例
用OpenInventor实现的NeHe OpenGL教程-第八课这节课我们将在第七节课的基础上增加纹理透明的效果。在OpenGL中,透明效果是通过“融合”(Blend)方式实现的。在NeHe教程中已经对融合的原理做了详细的讨论。这里我们就不再详细讨论了…...
如何建设一个公众号电影网站/aso推广优化
原标题:废水中氨氮超标的原因氨氮超标的危害及后果废水中氨氮是指以氨或铵离子形式存在的化合氮,即污水中以游离氨(NH3)和铵离子(NH4)形式存在的氮。高浓度废水的氨氮在没有经过严格处理后,直接排放到大自然水体,会导致水体的富营…...
怎么做建设网站首页/最近的新闻热点时事
慢查询日志:MySQL慢查询日志记录下所有执行超过long_query_time时间的SQL语句,帮你找到执行慢的SQL,方便我们对这些SQL进行优化。慢查询日志的配置: 默认情况下,mysql没有启用慢查询日志。 [rootrh64 ~]# mysql -u r…...