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

【无标题】无名管道

无名管道(Unnamed Pipe,也称为匿名管道)是 Unix/Linux 系统中最基础的进程间通信(IPC)机制之一,用于在有亲缘(亲缘)关系的进程(如父子进程、兄弟进程)之间进行单向问数据传输。

无名管道的核心特点

  1. 无标识:不像命名管道(FIFO)有文件系统中的路径标识,无名管道仅存在于内存中,进程通过文件描述符访问。
  2. 半双工:数据只能单向流动,如需双向通信需创建两个无名管道。
  3. 亲缘关系限制:仅能在父子进程、兄弟进程等有共同祖先的进程间使用(通过 fork 继承管道的文件描述符)。
  4. 面向字节流:数据按字节顺序传输,没有消息边界(类似 TCP 流)。
  5. 阻塞特性
    • 读端:管道为空时,读操作会阻塞,直到有数据写入。
    • 写端:管道满时,写操作会阻塞,直到数据被读取。
    • 若写端关闭,读端会读到 0(表示数据结束);若读端关闭,写操作会触发 SIGPIPE 信号(默认终止进程)。

无名管道的创建与使用

通过 pipe() 系统调用创建无名管道,函数原型:

#include <unistd.h>
int pipe(int pipefd[2]);
  • 参数 pipefd 是一个长度为 2 的数组,用于存储管道的两个文件描述符:
    • pipefd[0]:读端(接收数据)
    • pipefd[1]:写端(发送数据)
  • 返回值:成功返回 0,失败返回 -1 并设置 errno

使用流程(父子进程通信示例)

  1. 父进程调用 pipe() 创建管道。
  2. 父进程调用 fork() 创建子进程,子进程会继承管道的两个文件描述符。
  3. 关闭不需要的端(如父进程关闭读端,子进程关闭写端,实现父→子通信)。
  4. 通过 write() 写入数据,read() 读取数据。
  5. 通信结束后关闭管道描述符。

示例代码:

#include <stdio.h>
#include <unistd.h>
#include <string.h>int main() {int pipefd[2];char buf[1024];// 1. 创建无名管道if (pipe(pipefd) == -1) {perror("pipe failed");return 1;}// 2. 创建子进程pid_t pid = fork();if (pid == -1) {perror("fork failed");return 1;}if (pid == 0) {  // 子进程:读数据close(pipefd[1]);  // 关闭子进程的写端(不需要)// 读取管道数据ssize_t n = read(pipefd[0], buf, sizeof(buf));if (n > 0) {printf("子进程收到:%.*s\n", (int)n, buf);}close(pipefd[0]);  // 关闭读端return 0;} else {  // 父进程:写数据close(pipefd[0]);  // 关闭父进程的读端(不需要)// 向管道写入数据const char *msg = "Hello from parent!";write(pipefd[1], msg, strlen(msg));close(pipefd[1]);  // 关闭写端(触发子进程读端返回0)return 0;}
}

无名管道的应用场景

  • 父子进程间的简单数据传递(如父进程向子进程传递配置参数)。
  • shell 中的管道命令(如 ls | grep "txt",通过无名管道连接 lsgrep 进程)。
  • 进程间的简单协同(如子进程完成任务后向父进程发送通知)。

与命名管道(FIFO)的核心区别

特性无名管道(Pipe)命名管道(FIFO)
标识方式仅通过文件描述符,无文件路径有文件系统路径(如 /tmp/myfifo
适用进程仅限亲缘关系进程任意进程(通过路径访问)
生命周期随进程退出而销毁存在于文件系统,需手动删除

总结:无名管道是一种轻量级的 IPC 机制,适用于亲缘进程间的简单单向通信,其设计简单、效率较高,但受限于亲缘关系和半双工特性,无法满足复杂通信场景。

http://www.dtcms.com/a/321493.html

相关文章:

  • (第二篇)spring cloud之Eureka注册中心
  • JDK、eclipse的安装,配置JDK、Tomcat并使用eclipse创建项目
  • SpringBoot 处理 RESTful 服务中的异常与错误
  • 我和 ChatGPT:一次用 AI 反观自己的技术成长之旅
  • Android 中解决 Button 按钮背景色设置无效的问题
  • Redis 7主从复制与哨兵模式搭建
  • k8s-nfs实现创建sc的两种方式
  • ConcurrentDictionary 详解:.NET 中的线程安全字典
  • 并发编程(五)ThreadLocal
  • 生产环境Tomcat运行一段时间后,如何测试其性能是否满足后续使用
  • Rust语言序列化和反序列化vec<u8>,serde库Serialize, Deserialize,bincode库(2025年最新解决方案详细使用)
  • AI 智能体框架:LlamaIndex
  • 国内如何使用体验到GPT-5呢?附GPT快速升级Plus计划保姆级教程
  • 大模型量化上溢及下溢解析
  • 达梦DMFLDR导出和导入的方法
  • 以任务为中心的智能推荐系统架构设计:原理、实现与挑战分析
  • 深入理解Java集合框架:核心接口、实现类与实战选择
  • Vue2中,Promise.all()调用多个接口的用法
  • Numpy科学计算与数据分析:Numpy文件操作入门之数组数据的读取和保存
  • 智慧社区(十)——声明式日志记录与小区地图功能实现
  • 解决MinIO上传图片后返回URL无法访问的问题
  • Linux 启动流程实战:Device Tree 全解析与驱动绑定机制
  • 【LLM实战】RAG高级
  • 从0到1开发剧本杀小程序:全流程指南与避坑指南
  • 使用 C# 通过 .NET 框架开发应用程序的安装与环境配置
  • 网吧在线选座系统|基于java和小程序的网吧在线选座小程序系统设计与实现(源码+数据库+文档)
  • [202403-E]春日
  • 小程序难调的组件
  • 悬赏任务系统网站兼职赚钱小程序搭建地推抖音视频任务拉新源码功能详解二开
  • LangChain学习笔记05——多模态开发与工具使用