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

管道-匿名管道

一、管道介绍 

        管道(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.限制和注意事项:
  • 有限性: 管道的缓冲区有限,可能导致阻塞,特别是在没有足够空间来容纳数据时。
  • 同步问题: 管道的使用可能涉及到进程间的同步问题,需要谨慎处理。
图1  匿名管道
ls |wc -l

        这是一种典型的使用匿名管道的情况,用于连接两个进程,其中一个进程的输出成为另一个进程的输入。在这里,ls命令用于列出目录中的文件,而wc -l命令则用于统计行数,因此可以用于统计目录中文件的数量。

 二 、管道特点

 

匿名管道工作

  1. 内核内存中的缓冲器:

    • 管道是在内核内存中维护的缓冲器,用于在两个进程之间传递数据。这个缓冲器是有限的,因此管道的容量是有限的,当管道达到容量上限时,写操作可能会阻塞。
  2. 匿名管道与有名管道的特性:

    • 匿名管道没有文件实体,它是通过系统调用 pipe 创建的。有名管道则是在文件系统中有唯一名称的文件,通过 mkfifo 创建。有名管道可用于不同进程之间的通信,而匿名管道通常用于有亲缘关系的进程。
  3. 管道的读写操作:

    • 管道的读写操作与文件相似,可以使用标准的文件I/O操作,如readwrite。进程通过向管道写入数据,或从管道读取数据来进行通信。
  4. 消息边界的缺失:

    • 与消息队列不同,管道是一个字节流,不存在消息边界的概念。进程可以读取任意大小的数据块,而不受写入数据块大小的限制。这种特性使得管道在流式数据传输场景中非常灵活。
  5. 数据的顺序性:

    • 管道传递的数据是顺序的,即数据的读取顺序与写入顺序保持一致。这确保了在管道中传递的数据在接收端是按照正确的顺序被处理。
  6. 单向传递:

    • 管道是单向的,即数据的传递方向是确定的。一端用于写入数据,另一端用于读取数据。这使得管道成为半双工的通信机制。
  7. 一次性读取:

    • 从管道中读取数据是一次性的操作,即一旦数据被读取,它就从管道中被移除。这也意味着,如果某个进程没有读取所有写入管道的数据,这些数据将被丢弃。
  8. 无法随机访问:

    • 与文件不同,管道中的数据不能通过 seek() 等操作进行随机访问。由于管道是一个流式的通信机制,数据只能按顺序读取。
  9. 匿名管道的限制:

    • 匿名管道通常限制在具有公共祖先的进程之间使用。这通常是父子进程之间的通信,或者通过其他方式具有亲缘关系的进程之间的通信。匿名管道是在 pipe() 系统调用时创建的。

三、 为什么可以使用管道进行进程间通信

 

        在父子进程或兄弟进程之间使用匿名管道进行通信时,理解文件描述符表的概念是非常重要的。文件描述符表是每个进程内部维护的一张表,用于跟踪打开的文件和其他I/O资源。以下是匿名管道在进程间通信中与文件描述符表的关系:

  1. 文件描述符的创建:

    • 当调用 pipe 系统调用创建匿名管道时,会返回两个文件描述符,这两个文件描述符分别代表管道的读端和写端。
  2. 父子进程之间的文件描述符继承:

    • 在调用 fork 创建子进程时,子进程将会继承父进程的文件描述符表。这意味着子进程也会获得父进程的管道文件描述符。
  3. 关闭不需要的文件描述符:

    • 通常,在使用管道进行通信时,需要关闭不需要的文件描述符。例如,在子进程中关闭管道的写端,在父进程中关闭管道的读端,以确保每个进程只使用它需要的文件描述符。
  4. 数据流动:

    • 当一个进程向管道写入数据时,数据通过管道流向另一个进程。这是通过在一个进程中使用 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;
}

相关文章:

管道-匿名管道

一、管道介绍 管道&#xff08;Pipe&#xff09;是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入&#xff0c;从而实现数据的流动。管道是一种轻量级的通信方式&#xff0c;用于协调不同进程的工作。 1. 创建和使用管道&#…...

【JavaEE基础学习打卡08】JSP之初次认识say hello!

目录 前言一、JSP技术初识1.动态页面2.JSP是什么3.JSP特点有哪些 二、JSP运行环境配置1.JDK安装2.Tomcat安装 三、编写JSP1.我的第一个JSP2.JSP执行过程3.在IDEA中开发JSP 总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学者、爱好者&#xff0c;小白白。我们的天赋并不高…...

使用序列到序列深度学习方法自动睡眠阶段评分

深度学习方法&#xff0c;用于使用单通道脑电图进行自动睡眠阶段评分。 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…...

【算法】排序——选择排序和交换排序(快速排序)

主页点击直达&#xff1a;个人主页 我的小仓库&#xff1a;代码仓库 C语言偷着笑&#xff1a;C语言专栏 数据结构挨打小记&#xff1a;初阶数据结构专栏 Linux被操作记&#xff1a;Linux专栏 LeetCode刷题掉发记&#xff1a;LeetCode刷题 算法头疼记&#xff1a;算法专栏…...

Docker 容器监控 - Weave Scope

Author&#xff1a;rab 目录 前言一、环境二、部署三、监控3.1 容器监控 - 单 Host3.2 容器监控 - 多 Host 总结 前言 Docker 容器的监控方式有很多&#xff0c;如 cAdvisor、Prometheus 等。今天我们来看看其另一种监控方式 —— Weave Scope&#xff0c;此监控方法似乎用的人…...

Spring Boot集成redis集群拓扑动态刷新

项目场景&#xff1a; Spring Boot集成Redis集群&#xff0c;使用lettuce连接Cluster集群实例。 问题描述 redis其中一个节点挂了之后&#xff0c;springboot集成redis集群配置信息没有及时刷新&#xff0c;出现读取操作报错。 java.lang.IllegalArgumentException: Connec…...

COCI2022-2023#1 Neboderi

P9032 [COCI2022-2023#1] Neboderi 题目大意 有一个长度为 n n n的序列 h i h_i hi​&#xff0c;你需要从中选择一个长度大于等于 k k k的子区间 [ l , r ] [l,r] [l,r]&#xff0c;使得 g ( h l h l 1 ⋯ h r ) g\times (h_lh_{l1}\cdotsh_r) g(hl​hl1​⋯hr​)最小&…...

由于找不到d3dx9_43.dll无法继续执行此代码怎么解决?全面解析d3dx9_43.dll

在使用计算机过程中&#xff0c;我们可能会遇到各种各样的问题。其中之一就是d3dx9_43.dll文件丢失的问题。这个问题通常会出现在运行某些应用程序或游戏时&#xff0c;导致程序无法正常启动或运行。那么&#xff0c;如何解决这个问题呢&#xff1f;小编将为您提供一些解决方案…...

Linux--网络编程-字节序

进程间的通信&#xff1a; 管道、消息队列、共享内存、信号、信号量。 特点&#xff1a;都依赖于linux内核。 缺陷&#xff1a;无法多机通信。 一、网络编程&#xff1a; 1、地址&#xff1a;基于网络&#xff0c;ip地址端口号。 端口号作用&#xff1a; 一台拥有ip地址的主机…...

python实现http/https拦截

python实现http拦截 前言:为什么要使用http拦截一、技术调研二、技术选择三、使用方法前言:为什么要使用http拦截 大多数爬虫玩家会直接选择API请求数据,但是有的网站需要解决扫码登录、Cookie校验、数字签名等,这种方法实现时间长,难度高。需求里面不需要高并发,有没有…...

农产品团购配送商城小程序的作用是什么

农产品覆盖稻麦油蛋等多种细分类目&#xff0c;各地区经营商家众多&#xff0c;随着人们生活品质提升&#xff0c;对食物的要求也在提升&#xff0c;绿色无污染无激素的农产品往往受到不少人喜爱&#xff0c;而在销售中&#xff0c;也有不少人选择自建商城线上经营。 通过【雨…...

使用van-dialog二次封装微信小程序模态框

由于微信小程序的wx.showModal不支持富文本内容&#xff0c;无法实现更灵活的展示效果&#xff0c;故需要进行二次封装 实现思路&#xff1a;使用van-dialog以及微信小程序的rich-text实现 代码如下&#xff1a; // index.wxml <van-dialoguse-slottitle"提示"s…...

生鲜蔬果同城配送社区团购小程序商城的作用是什么

生鲜蔬果行业作为市场主要支撑之一&#xff0c;从业商家众多的同时消费者也从不缺&#xff0c;尤其对中高城市&#xff0c;生鲜蔬果除了传统线下超市、市场经营外&#xff0c;线上更是受到大量消费者信任&#xff0c;而很多商家也是自建了生鲜蔬果商城多场景生意经营。 那么通…...

Unity实现设计模式——状态模式

Unity实现设计模式——状态模式 状态模式最核心的设计思路就是将对象的状态抽象出一个接口&#xff0c;然后根据它的不同状态封装其行为&#xff0c;这样就可以实现状态和行为的绑定&#xff0c;最终实现对象和状态的有效解耦。 在实际开发中一般用到FSM有限状态机的实现&…...

差分数组的应用技巧

前缀和技巧 针对的算法场景是不需要对原始数组进行修改的情况下&#xff0c;频繁查询某个区间的累加和。 差分数组 主要适用场景是频繁对原始数组的某个区间的元素进行增减。 相关题目 1094. 拼车 1109. 航班预订统计 370. 区间加法 # 1094. 拼车 class Solution:def carPool…...

斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 10 Mining Social-Network Graphs

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和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&#xff0c;将数字 1∼n1∼n 排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数 nn。 输出格式 按字典序输出所有排列方案&#xff0c;每个方案占一行。 数据…...

pytorch之nn.Conv1d详解

自然语言处理中一个句子序列&#xff0c;一维的&#xff0c;所以使用Conv1d...

H5生成二维码

H5生成二维码&#xff1a; 1.引入js库&#xff0c;可自行点击链接复制使用 <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场景中将贴图与球形网格模型融合&#xff0c;将球模型当做成环境容器使用处理视频时需要以dom为载体&#xff0c;加载与控制视频动作每次渲染时更新当前texture&#xff0c;以达到视频播放效…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…...