Linux管道

匿名管道 Linux 整理一下控制代码,这里是输入型参数,只需要读这样就可以轮询方式选择进程了,不用随机了结果。 阅读详情

一 概述

管道是Linux中一种重要的通信方式,是吧一个程序的输出直接连接到另一个程序的输入。常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。有名管道叫named pipe或者FIFO(先进先出),可以用函数mkfifo()创建。

二 管道的实现机制

在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:

  1. 限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不像文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。
  2. 读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。

注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。

三 管道的结构

在Linux系统中,管道的实现并没有使用专门的数据结构,而实借助于文件系统的file结构和VFS(Virtual File System)的索引结点node。通过将两个file结构指向同一个临时的VFS索引结点,而这个VFS索引结点又指向一个物理页面而实现。

四 管道的读写

管道的实现的源代码在fs/pipe.c中,在pipe.c中有很多函数,其中有两个比较重要的函数,即管道的读写函数:pipe_read() ,pipe_write()。管道写函数通过将字节复制到VFS所以结点指向的物理内存而写入数据,而管道读函数则通过复制物理内存中的字节而读出数据。当然,内核必须利用一定的机制同步对管道的访问,为此,内核使用了锁,等待队列和信号。

当写进程向管道中写入时,它利用标准的库函数write(),系统根据库函数传递的文件描述符,可找到该文件的 file 结构。file 结构中指定了用来进行写操作的函数(即写入函数)地址,于是,内核调用该函数完成写操作。写入函数在向内存中写入数据之前,必须首先检查 VFS 索引节点中的信息,同时满足如下条件时,才能进行实际的内存复制工作:

1.内存中有足够的空间可容纳所有要写入的数据;

2.内存没有被读程序锁定。

如果同时满足上述条件,写入函数首先锁定内存,然后从写进程的地址空间中复制数据到内存。否则,写入进程就休眠在 VFS 索 引节点的等待队列中,接下来,内核将调用调度程序,而调度程序会选择其他进程运行。写入进程实际处于可中断的等待状态,当内存中有足够的空间可以容纳写入 数据,或内存被解锁时,读取进程会唤醒写入进程,这时,写入进程将接收到信号。当数据写入内存之后,内存被解锁,而所有休眠在索引节点的读取进程会被唤醒。

管道的读取过程和写入过程类似。但是,进程可以在没有数据或内存被锁定时立即返回错误信息,而不是阻塞该进程,这依赖于文件或管道的打开模式。反之,进程可 以休眠在索引节点的等待队列中等待写入进程写入数据。当所有的进程完成了管道操作之后,管道的索引节点被丢弃,而共享数据页也被释放。

因为管道的实现涉及很多文件的操作,因此,当读者学完有关文件系统的内容后来读pipe.c中的代码,会有助于理解。

Linux 管道对阻塞之前一次写操作的大小有限制。 专门为每个管道所使用的内核级缓冲区确切为 4096 字节。 除非阅读器清空管道,否则一次超过 4K 的写操作将被阻塞。 实际上这算不上什么限制,因为读和写操作是在不同的线程中实现的。

【Linux】管道 父进程分别以读和写的方式打开同一个文件,父进程再创建子进程,子进程会继承父进程的进程控制块和文件描述符表,父进程打开的文件子进程也可以在子进程的文件描述符表中找到,此时父子进程看到了一份公共的文件,这才有了通信的前提。首先在磁盘当中通过mkfifo()函数创建一个管道文件,两个进程间通信是OS将管道文件加载到内存中这个管道文件就变成了内存级别的文件在内存中是struct file结构体,进程1向进程2发送信息时,通过向这个管道文件向文件中写入信息,进程2在这个管道文件中读取信息。 阅读详情

相关推荐

探索niri:让你的Linux桌面布局无拘无束

niri是一款基于Wayland的滚动平铺合成器,采用创新的窗口管理方式。它将窗口排列为向右无限延伸的条目,支持独立显示器布局和动态垂直工作区,确保多任务操作流畅性。核心功能包括概要视图、截图界面、屏幕投射、手势操作、窗口分组等,并支持自定义布局和动画效果。niri具备良好的稳定性,兼容xwayland-satellite工具,灵感来自PaperWM但突破了GNOME限制。该项目为追求高效桌面管理的用户提供了全新解决方案,欢迎加入社区交流体验。

weixin_44626085的博客 1818

Linux — 管道

引入管道: 每个进程各自有不同的PCB(task_struct),各自拥有不同的用户地址空间,所以进程的运行是具有独立性的,当操作系统需要完成某项功能时需要进程间进行交互,这时内核协助各进程完成相互访问。 管道的本质: 1.管道是内核开辟的专门用来进程间通信的一块文件缓冲区,一个进程连接到另一个进程在管道中传输的数据是以字符流的形式; 2.管道是单向的,一个进程在管道的一端进行数据的读取,...

静陌慕春 741

CESM2 实验笔记

文章目录1. 重新启动1.1 关于重启文件2. RUN_TYPE 初始化运行方式startupbranchhybrid3. branch 或者 hybrid运行的示例4. 其他声明5. 关于RESUBMIT 1. 重新启动 参考: https://bb.cgd.ucar.edu/cesm/threads/how-to-restart-cesm2-1-3-fhist-from-a-backup.5245/#post-36275 适用情况:模型运行因时间不足或其它原因中断,需要继续运行 方法1:将CONTIN

qq_38607066的博客 1万+

linux管道简单理解

什么是管道,怎么理解呢 管道(Pipeline),其实简单理解来看,管道的作用是在命令和命令之间,传递数据。比如说一个命令的结果,作为另一个命令的输入。命令其实就是进程。更准确地说,管道在进程间传递数据. linux里的管道将一个进程的输出流定向输入到另一个进程,像管道一样,把两个进程连接起来,如果一个进程输出了信息,那么另一个进程就能获取到输出的信息. 我们知道,在linux中,系统把所有的元素都抽象为文件,其中也包括socket,那么管道其实也分为匿名管道和命名管道. 匿名管道,这种管道在文件系统中,

cherises的博客 2771

轨迹规划——带抛物线过渡的直线插补

带抛物线过渡的直线插补

doudou2weiwei的博客 1986

基于Jira与Confluence的企业知识库AI助手构建实战

检索增强生成(RAG)技术通过结合信息检索与大型语言模型,有效解决了AI在专业领域知识不足的问题。其核心原理是将外部知识库(如企业文档)进行向量化存储,在用户提问时进行语义检索,并将相关上下文注入提示词中,从而生成精准、有据可依的回答。这一技术架构在工程实践中价值显著,它无需重新训练模型即可让AI掌握特定领域的专业知识,大幅提升了回答的准确性与实用性。典型的应用场景包括智能客服、企业内部知识问答以及代码辅助等。本文以开源项目`dev-kostiuk/jira-confluence-ai-context`为例

weixin_42520448的博客 368

Linux进程间通信(1)管道

管道 管道可以用来在两个进程之间传递数据,如: ps -ef | grep “bash”, 其中‘|’就是管道,其作用就是将 ps 命令的结果写入管道文件,然后 grep 再从管道文件中读出该数据进行过滤。 你可以用管道操作符I来连接进程。Linux与MS-DOS不同,在Linux下通过管道连接的进程可以同时运行,并且随着数据流在它们之间的传递可以自动地进行协调。举一个简单的例子,你可以使用sort命令对ps命令的输出进行排序。 $ ps >psout.txt $ sort psout.txt

weixin_48560325的博客 1487

RT-DETR改进有效系列目录 | 包含卷积、主干、RepC3、注意力机制、Neck上百种创新机制

Hello,各位读者们好Hello,各位读者,距离第一天发RT-DETR的博客已经过去了接近两个月,这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用,旨在为大家解决为什么用v8的仓库训练的时候模型不收敛,精度差的离谱的问题,我也是成功的找到了解决方案,对于ultralytics仓库进行多处改进从而让其还原RT-DETR官方的实验环境从而达到一比一的效果。同时本人一些讲解视频和包含我所有创新的RT-DETR文档。

Snu77的博客 3万+

Linux-管道

在 Linux 中,管道(pipe)是一种进程间通信(IPC)的方式,它允许一个进程将其输出直接连接到另一个进程的输入,而无需使用临时文件或文件系统进行中间存储。

2401_84019382的博客 1395

回归预测 | MATLAB实现MPR多元多项式回归

回归预测 | MATLAB实现MPR多元多项式回归

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1645

YOLOv11 环境配置全流程 | 从零开始搭建训练与推理环境

YOLOv11环境配置与训练全流程指南 本文详细介绍了YOLOv11目标检测模型的环境配置、训练与推理全流程。内容包括: 环境要求:列出GPU、CUDA、Python等组件的版本要求,提供快速检查脚本 Windows配置: CUDA 12.6和cuDNN 8.9.7安装步骤 使用Conda创建隔离环境 PyTorch GPU版本安装方法 IDE环境配置 Linux配置:提供Ubuntu 22.04下的CUDA、cuDNN安装命令和Conda环境搭建 Docker方案:提供一键式容器化部署命令 训练实战: 数

shrgegrb的博客 2021

linux——管道详解

符号表示 | 和管道特别形象。 作用:     管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。 有名管道叫named pipe或者FIFO(先进先出),可以用函数mkfifo()创建。 实现机制 &nb...

龙跃十二 5446

龙虾机器人(OpenClaw)本地部署完全技术指南

在开始部署之前,我们需要明确部署的对象。通常所说的“龙虾机器人”指的是开源项目 OpenClaw(曾用名:Clawdbot、Moltbot)。它由程序员彼得·斯坦伯格开发,是一个开源的、可本地部署的通用型AI代理系统。与ChatGPT等对话式AI不同,OpenClaw被赋予了操作系统的权限:它可以执行终端命令、读写文件、操控浏览器、安装软件,甚至通过MCP协议调用外部工具。

huanghm88的专栏 2万+

linux中管道的概念,浅谈Linux管道

管道(pipe)是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念。管道是UNIX环境中历史最悠久的进程间通信方式,从本质上说,管道也是一种文件,也是遵循UNIX的“一切皆文件”的原则设计的。虽然实现形态上是文件,但是管道本身并不占用磁盘或者其他外部存储的空间。在Linux的实现上,它占用的是内存空间。所以,Linux管道实际上就是一个操作方式为文件的内存缓冲区。一、Linux管道分...

weixin_42332910的博客 6115

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

linux管道使用_如何在Linux上使用管道

linux管道使用Fatmawati Achmad Zaenuri/Shutterstock.comFatmawati Achmad Zaenuri / Shutterstock.comUse Linux pipes to choreograph how command-line utilities collaborate. Simplify complex processes and boost...

cuma1988的博客 4725

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Linux】Linux的管道

管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。其思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。由于这种方式具有单向传递数据的特点,所以这个作为传递消息的共享文件就叫做“管道”。 在管道的具体实现中,根据通信所使用的的文件是否具有名称,有“匿名管道”和“命名管道”。   管道与共享内存的区别 乍一看,感觉管道和共享...

Yngz_Miao的博客 4万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LINUX管道

内核在处理管道数据的时候,底层也要调用类似read和write这样的方法进行数据拷贝,这种内核操作每次可以操作的数据量也是有限的,一般的操作长度为一个page,即默认为4k字节。它的特点是只能在父子进程中使用,父进程在产生子进程前必须打开一个管道文件,然后fork产生子进程,这样子进程通过拷贝父进程的进程地址空间获得同一个管道文件的描述符,以达到使用同一个管道通信的目的。管道,英文为pipe。对比以上两种方法,我们也可以理解为,管道本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。

m0_55915945的博客 2145

Linux 管道

在Linux中,管道(pipe)是一种进程间通信机制,它允许将一个命令的输出直接作为另一个命令的输入。管道使用符号来连接命令,实现数据的流向。创建管道的系统调用是 pipe,其包含在头文件参数 int pipefd[2]是一个输出型参数,是一个长度为2的数组,其中 pipefd[0]是管道的读端fd,而pipefd[1]是管道的写端fd。管道的工作原理是在内核中创建一个缓冲区,用于存储一个命令的输出和另一个命令的输入。

2301_79881188的博客 2517

【Linux】命名管道

命名管道的内容和使用,以及和匿名管道的关系

s_little_monster的博客 8537

Linux之管道

从/etc/passwd文件中获取第7个字段(即用户的shell类型),然后使用sort命令排序,最后使用uniq命令统计每种shell类型出现的次数。其中,-F选项指定了字段分隔符为“:”,|符号表示将前面命令的输出作为后面命令的输入。当输出内容比较多时,为了方便浏览,竟可能输出内容,通过管道操作符,传递给more命令来分页查看,也可传递给grep命令实现对指定对象的查看。(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一量这些工作完成之后,它们具有相同的语义。作为下一个命令的输入。

qq_57289939的博客 1570

Linux 管道 管道命令 命名管道

读了《Unix/Linux系统编程》第三章关于管道部分,根据书上内容与网上资料进行了总结。如果有问题请批评指正! 1. 管道相关概念 管道是用于进程交换数据的单向进程间通信通道。 管道有一个读取端进程和一个写入端进程,且读取端进程与写入端进程不能是同一个进程。数据只能从写入端写入,读取端读出。且数据一旦被读走遍不在管道中存在,即不可反复读取。 管道不能同时读写,且数据传输方向是单向的。有些系统支持双向管道,数据可以双向传输。 读取端读数据时:如果管道上有数据,读进程根据需要读取管道中的数据并返回

Nick_Di的博客 857

【Linux】[万字] 详解 Linux管道通信:匿名管道、命名管道的原理及使用等

管道, 是Unix中最古老的进程间通信的方式 管道, 其实就是 一个进程连接到另一个进程的数据流. 就像我们生活中, 管道是输送资源的:石油、天然气等 而系统中的管道, 则是输送数据的. 那么管道究竟是什么? 管道, 其实是 一个打开的文件. 但是这个文件很特殊.

七月.cc的博客 2474
上一篇: Redis中的Pipeline
下一篇: Java的平台无关性
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值