管道:匿名管道和有名管道的区别和联系

1️⃣ 定义

匿名管道(anonymous pipe)

  • 描述 :一种无文件名的、临时存在于内存的单向数据通道。

  • 特点:

    • 生命周期仅存在于创建它的进程及其子进程之间。
    • 多用于有亲缘关系的进程通信(父子进程)。
    • Shell 中的 | 就是典型匿名管道。
  • 创建方式:

    • C语言中 pipe(fd) 系统调用
    • Shell:cmd1 | cmd2

有名管道(named pipe / FIFO)

  • 描述 :一种在文件系统有名字的管道文件,本质是 FIFO 先进先出通信机制。

  • 特点:

    • 可供无亲缘关系的进程通信(只要有路径名)。
    • 名称存在于磁盘,但读写数据走内核缓冲,不落入磁盘。
    • 单向通信(双向需两个 FIFO)。
  • 创建方式:

    • Shell:mkfifo filename
    • C语言:mkfifo() 系统调用

普通文件(regular file)

  • 描述:常规的存储文件,用于持久化数据。

  • 特点:

    • 数据保存在磁盘(或 SSD 等介质)。
    • 可随机访问,支持 lseek。
    • 生命周期可长久存在,直至删除。

2️⃣ 核心功能特性对比

特性 匿名管道 有名管道(FIFO) 普通文件
是否有文件名 否 有(路径名) 有
进程关系要求 必须有亲缘关系(父/子) 无亲缘关系也可通信 无要求
数据流向 单向(半双工) 单向(半双工) 双向可读可写
存储位置 内核内存缓冲区 内核内存缓冲区 磁盘/存储设备
数据是否持久化 否,读走就消失 否,读走就消失 是,存到介质
生命周期 进程结束即消失 删除 FIFO 文件前一直存在 删除文件前一直存在
阻塞特性 默认阻塞(需读写两端配合) 默认阻塞(需读写两端配合) 读写互不依赖(除非文件锁)
访问方式 顺序读写(不能 lseek) 顺序读写(不能 lseek) 顺序/随机访问均可
使用场景 临时父子进程数据传输 长期运行程序间通信 存储与读取数据
创建方式(Shell) mkfifo fifo_name
文件类型标识(ls -l) 不在文件系统显示 p(pipe) -(regular file)

3️⃣ 图解类比

类比:

  • 匿名管道 :
    临时搭一条塑料软管,直接连两个机器,中间没有名字,任务结束软管拆掉。
  • 有名管道 :
    在墙上安装一个固定的水管接口(有标签/名字),任何人把软管接上都能用。
  • 普通文件 :
    把水装在水桶(硬盘)里,等什么时候要用再去取。
相关推荐
llqbzllll19 分钟前
Spring AI 工具调用不是反射一下就结束:用 2.0.1 跑通失败恢复与调用上限
人工智能·后端
狼爷1 小时前
Rust/Go/Java/Python/PHP 大比拼:负载下后端框架到底差多少?
java·后端·编程语言
mantou1322 小时前
我给 AI Agent 做了个「油猴」:让 Claude Code / Codex 直接用你已登录的浏览器
前端·javascript·后端
程序员老赵2 小时前
Docker 部署 DeepSeek Harness:轻松搭建局域网里的 AI Agent 平台
后端·ai编程·deepseek
YIAN2 小时前
实战|用 DeepSeek + SQLite 从零搭建轻量 Text2SQL 查询助手
后端·sqlite·deepseek
王中阳Go2 小时前
自己摸了 2 个月零 offer,补底子只用了 3 块:Go 后端转 AI 最难的不是技术
后端·agent·ai编程
高频因子挖掘机2 小时前
第一次补历史行情:按股票拆,还是按日期拆请求?
后端·github·api
小园子的小菜2 小时前
Python协程深度解析:从原理演进到实战避坑
后端·python
高频因子挖掘机2 小时前
300 只股票 × 两年日 K:为什么逐只循环会变成维护灾难?
后端·github·api
苏三说技术3 小时前
Spring AI Alibaba已停更了,Java还有希望吗?
后端