$ cmd1 | cmd2$ cmd$ cmd1 | cmd2$ cmd1 | cmd2 | cmd3
阅读更多深度技术文章,扫一扫上面的二维码关注微信公众号「码洞」
墨衍会员
·
AI 创作全网分发
墨衍智能分发
本文由作者通过墨衍一键同步至各平台
1分发平台
100+累计阅读
144平均单平台
已同步平台
优快云
微信公众号
微博
知乎
掘金
百家号
博客园
抖音
小红书
你的文章也可以这样分发
墨衍会员 ¥399起/年,写一次发全网
我也要 →
码龄7年
管道命令我们经常使用,将一个指令的输出导入另一个指令的输入,也就是屁股对上嘴,这个原理连编程小学生都知道。但是如果要深入问进去,一个指令的输出是如何导入到另一个指令的输入,管道又起到什么角色,估计能回答这个问题的人不足 1%。下面我们来深入分析一下管道指令的实现原理,对于下面的这条指令,shell 到底干了些什么
$ cmd1 | cmd2首先我用下面这张图来描述最终形态,然后再一步一步来分解最终形态的形成过程
上图我们看到了进程描述符表、管道、进程的父子关系。
fork 和 exec
shell 每次执行指令, 需要 fork 出一个子进程来执行,然后将子进程的镜像替换成目标指令,这又会用到 exec 函数。比如下面这条简单的指令
$ cmd
exec 函数不会改变当前进程的进程号,不会改变进程之间的父子关系。可以将进程看成一个带壳的球体,exec 之后,外面的壳不会变,球里面的东西被完全替换了。而输入输出文件描述符默认在壳上面,这意味着指令 cmd 的输入输出继承了 shell 进程的输入输出。
$ cmd1 | cmd2当指令里面包含一个管道符,意味着需要并行执行两个指令,这时候 shell 需要 fork 两次生成两个子进程,然后分别 exec 换成目标指令。
我们注意到图里面还有一个 pipe,它就是负责父子进程通信的管道。
pipe
管道用于父子进程的通信,在 fork 之前创建 pipe,pipe将成为 fork 之后父子进程之间的纽带。pipe 函数会返回两个描述符(pipe_in, pipe_out),一个用于读,一个用于写。
dup2
下面我们就需要调整图中描述符的尖头,将 cmd1 进程的 stdout 描述符指向管道写,将 cmd2 进程的 stdin 描述符指向管道读,这就需要神奇的 dup2(fd1, fd2) 函数,它的作用是将 fd1 描述符关联 fd2 指向的内核对象,之前 fd1 指向的内核对象引用计数减一,如果减到零就销毁。注意平时我们调用 close 方法本质上只是递减引用计数,同一个内核对象是可以被多个进程共享的。当引用计数减到零时就会正式关闭。
下面我们将 dup2 函数的规则应用一下,对两个进程分别调用 dup2 方法得到
然后再将不需要的描述符关闭掉,就得到了下面的终极图,完美!
如果是两个管道符三个命令如下,就会生成两个管道
$ cmd1 | cmd2 | cmd3
如果任意一端的进程突然挂掉了会发生什么?
假设 cmd1 先挂掉,管道写被动关闭,cmd2 在读取管道内容时会遭遇 EOF,然后正常结束。
假设 cmd2 先挂掉,管道读被动关闭,cmd1 继续写管道,这时候进程会收到一个 SIGPIPE 信号,默认动作是进程直接退出。
下一节我们将使用酷炫的代码来实现上面的整个过程,我们不仅要知道其中的原理,而且还需要通过亲手实验来了解其中更多的细枝末节。

阅读更多深度技术文章,扫一扫上面的二维码关注微信公众号「码洞」
当前文章被以下社区和专栏收录:
OpenClaw仿冒恶意程序GhostClaw攻击解析:从MCP到数据窃取的全面安全加固指南
本地AI助手正在成为开发者的新型数字员工,随着模型上下文协议(MCP)与工具调用能力的普及,以OpenClaw为代表的多智能体框架能高效调度系统资源、对接消息通道,极大提升了自动化效率。然而这类“本地优先+高权限”的工具一旦落入攻击者之手,就会演变为数据窃取的完美跳板。近期出现的GhostClaw恶意程序,正是利用开源信任链与一键部署脚本的盲区,伪装成OpenClaw仿冒项目,定向窃取SSH私钥、云平台凭据、.env配置文件等高价值资产。从供应链投毒到二维码钓鱼,从WSL2到Termux环境,攻击面覆盖开发
一个小小的 Shell 管道符,内部实现可真不简单!
管道命令我们经常使用,将一个指令的输出导入另一个指令的输入,也就是屁股对上嘴,这个原理连编程小学生都知道。但是如果要深入问进去,一个指令的输出是如何导入到另一个指令的输入,管道又起到什么角色,估计能回答这个问题的人不足 1%。下面我们来深入分析一下管道指令的实现原理,对于下面的这条指令,shell 到底干了些什么 $ cmd1 | cmd2 复制代码首先我用下面这张图来描述最终形态,然后再一步一步...
本地AI智能体部署指南:基于ChatGPT Work与Ollama搭建私有对话平台
大语言模型(LLM)的本地部署已成为AI应用开发的重要趋势,它解决了数据隐私、网络延迟和成本控制等核心问题。其技术原理在于将预训练模型部署在本地硬件,通过量化、优化等技术实现高效推理。本地部署不仅保障了数据安全,还为定制化AI应用开发提供了基础。在实际应用场景中,开发者常面临交互体验简陋、功能单一等挑战。AI Agent(智能体)框架通过引入工具调用、会话管理和任务规划等能力,将本地模型从简单的问答引擎升级为可执行复杂任务的智能助手。本文以开源框架ChatGPT Work(OpenClaw)为例,结合Oll
Linux shell:按行读取文件,有变量操作时,避免使用管道符?
Linux的Shell程序时,如果需要按行读取,常见的有两种办法,但是如果涉及到变量的赋值操作,则两种方法是有区别的。 以下两面的wc1.sh和wc2.sh为例子,两个程序都试图统计文件的行数: wc1.sh #!/bin/sh let i=0 cat /etc/passwd | while read line do let i=i+1 done echo "$i" wc2.sh #!/bin/sh let i=0 while read line do let i=i+1 don
show命令管道符深入解析
show命令管道符深入解析,常用的in b sess 等等
myshell.cpp
操作系统实验,尝试实现一个简单的shell,只实现了简单的功能,支持内部命令和外部命令,其他的功能可以慢慢完善。
管道符的工作原理
总之,管道符是Linux/Unix系统中非常实用的命令连接符号,可以将多个命令连接起来,实现复杂的操作。例如,可以使用ls命令列出文件列表并将其传递给grep命令进行搜索,也可以使用sort命令对文件进行排序。(3)管道连接:当用户使用管道符将两个命令连接起来时,管道符会将第一个命令的标准输出作为第二个命令的标准输入。在Linux/Unix系统中,管道符是常用的命令连接符号,用于将一个命令的输出作为下一个命令的输入。(1)命令执行:首先,用户在终端上输入一个或多个命令,这些命令将在当前进程中依次执行。
R语言分段回归
1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...
操作系统实验二:shell的实现
即实现 command1 | command2,该函数实现思路是将管道前后的命令分别由不同的进程执行,即 command1和 command2 分别通过子进程执行。再通过管道把两个进程的标准输入输出连接起来,把管道前的子进程的标准输出作为后面的输入,即重定向到管道数据入口,把管道后的标准输入重定向到管道数据出口就实现了管道。参数argv是原始的参数向量,out是分割“>”之后剩下的字符串,即重定向输出的位置。实现具有管道、重定向功能的shell,能够执行一些简单的基本命令,如进程执行、列目录等。
3种六轴IMU姿态解算算法对比:互补滤波、Mahony与卡尔曼滤波性能实测
本文深入对比了三种六轴IMU姿态解算算法:互补滤波、Mahony与卡尔曼滤波的性能表现。通过实测数据分析了各算法在精度、计算复杂度和适用场景上的差异,为无人机、机器人等运动控制系统提供了选型建议。重点探讨了六轴陀螺仪与加速度传感器的数据融合技术,帮助开发者根据项目需求选择最优解算方案。
微信本地数据解密实战:从AES加密原理到EnMicroMsg.db恢复指南
数据加密是保障信息安全的核心技术,其中对称加密算法AES因其高效可靠,被广泛应用于各类本地数据保护场景。其原理是通过特定密钥对数据进行混淆转换,确保未经授权者无法读取原始内容。在移动应用领域,本地数据库加密对于保护用户隐私、防止数据泄露具有重要价值。微信作为国民级应用,对其本地存储的聊天记录数据库(EnMicroMsg.db)采用了基于设备标识和用户UIN生成的AES-256-CBC加密方案。理解这一机制,不仅有助于在合法合规前提下进行个人数据备份与恢复,也为开发者进行客户端安全分析、兼容工具开发提供了基础
linux之管道符详解
linux管道符
基于MATLAB的特征模式分解(FMD)算法详解
本文详细介绍了基于MATLAB的特征模式分解(FMD)算法实现。FMD是一种新型自适应信号分解方法,通过自适应FIR滤波器组和相关峭度优化目标,有效解决传统方法(如EMD、VMD)的模态混叠问题。文章系统阐述了FMD的算法原理、数学模型和实现步骤,包括自适应FIR滤波器设计、相关峭度优化和模态选择机制。与现有方法相比,FMD在旋转机械故障诊断中展现出更强的特征提取能力和噪声鲁棒性。MATLAB实现部分包含核心函数、参数优化和可视化工具,并通过轴承故障等案例验证了算法的有效性。
自己动手实现 Shell多进程套套符
一篇技术文章如今仅仅是理论上讲得天花乱坠,却不能自己撸出东西来,那么它写的再好,也只能算纸上谈兵。继上一篇 《我们天天都在使用的套套符命令,Shell 在里面到底动了什么...
高德地图API如何使用
通过以上步骤,您可以成功接入并使用高德地图API来为您的应用添加丰富的地图功能。
YOLOv8改进策略【损失函数篇】| 替换Powerful-IoU(PIoU),增强对中等质量锚框的关注力,引导锚框更直接、高效地回归
现有基于IoU的损失函数存在不合理的惩罚因子,导致锚框在回归过程中出现面积扩大的问题,使得回归效率降低、收敛速度变慢。同时,这些损失函数在反映锚框与目标框之间的差异、考虑目标框大小以及某些情况下的性能表现等方面存在局限性。在目标检测任务中,边界框回归的损失函数对检测性能至关重要。Powerful-IoU(PIoU)及其升级版PIoU v2正是为解决现有损失函数存在的问题而设计的。本文利用PIoU改进YOLOv8的损失函数,提高模型精度。
Linux 进阶 alias 技巧:提升终端效率的实用指南
本文深入探讨了Linux系统中alias命令的进阶使用技巧,旨在帮助用户大幅提升终端操作效率。从基础的命令别名配置到封装复杂脚本和动态条件判断,文章详细介绍了如何将alias从简单的输入简化工具,转变为创造个性化高效命令的利器,并提供了实用的管理维护指南。
最新Python爬虫实战(入门爬虫篇)——案例3:爬取二次元cos图片批量下载到本地(附上完整爬虫代码)
本次案例通过Python爬虫技术实现了二次元图片的批量下载。代码采用模块化设计,函数实现cookies的自动解析,简化了配置流程,涵盖“请求列表页→提取详情页URL→请求详情页→提取图片链接→保存图片”的完整流程,与豆瓣案例的核心逻辑和格式完全对齐。学习重点包括:抓包工具定位多层级数据源、正则表达式匹配复杂链接、模拟请求头绕过反爬机制、文件名安全处理及自动化文件管理。需要注意控制请求频率并遵守网站使用规范,适用于入门爬虫实践,帮助学习者掌握多层级页面爬取的核心逻辑。
网站备份全攻略:从备份策略到工具选型,确保数据可恢复
在网站运营中,数据丢失往往源于备份方案的不完善或执行缺失。理解全量备份、增量备份与差异备份的差异,是制定合理备份策略的基础。逻辑备份工具如mysqldump适合跨版本迁移,而物理备份则能更高效地处理海量数据恢复。备份的本质不仅在于选择软件,更在于遵循3-2-1原则,并定期进行恢复演练来验证备份的真实可用性。对于站长而言,兼顾备份频率、保留周期与异地副本,是应对勒索、误删等风险的坚实屏障。真正可靠的方案,是能长期坚持执行并验证过的备份习惯,才能在关键时刻保障业务数据的安全与完整。
058、时域降噪(Temporal Denoise):运动补偿与递归滤波在视频降噪中的应用
本文深入探讨了时域降噪(Temporal Denoise)技术在视频处理中的应用。作者通过车载环视项目案例,揭示了空域降噪的局限性,提出利用帧间信息进行降噪的核心思路。文章详细解析了递归滤波和运动补偿两大关键技术,指出递归滤波简单但易产生拖影,而运动补偿通过计算运动矢量解决此问题。作者还分享了多帧降噪方案的优势与算力挑战,并总结了噪声模型匹配、运动矢量一致性等实战调优经验。最后强调时域降噪需要与空域降噪平衡,指出调试工具的重要性,提出"在保证运动区域无鬼影的前提下追求信噪比"的实践原则,体现了算法复杂度与效
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
本地LLM联网实战:安全隔离的AI Agent工具调用方案
AI Agent的核心能力在于感知外部世界并执行动作,而‘联网’是其实现动态交互的基础前提。其技术本质是将大语言模型的推理能力与可控、可审计的工具调用解耦,避免模型进程直接发起网络请求带来的安全失控、证书管理混乱、调试不可见等工程风险。通过进程隔离+协议抽象(如JSON-RPC)+中间件代理(如LangChain Tool Server)三层设计,可在本地环境(笔记本、NAS、树莓派)中构建低延迟、高安全、易维护的联网能力。该方案特别适用于Ollama等轻量级LLM运行时,支撑实时天气查询、网页搜索、本地文
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
Claude Code MCP 实战教程:从配置到自建服务器
模型上下文协议(MCP)作为连接 AI 应用与外部工具的事实标准,正在重塑编程助手的交互方式。它通过 Host、Client、Server 的角色分工和 JSON-RPC 消息传递,让大模型不再局限于对话,而是能够调用文件系统、数据库、浏览器等真实工具。这一机制不仅降低了工具接入的复杂度,也为 AI Agent 的开发提供了统一范式。在实际开发中,无论是配置 Claude Code 读取本地项目、在 VSCode 中安装扩展并管理 MCP,还是在 Windows 11 下调试路径与编码问题,核心都是理解这条
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
2514

被折叠的 条评论
为什么被折叠?



