尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Android随笔-pipe是什么?

Android随笔-pipe是什么?
📅 发布时间:2026/7/6 23:43:18

pipe 是 Linux 内核提供的进程间通信(IPC)机制,本质上是一个内核管理的环形缓冲区(ring buffer),让两个进程可以通过文件描述符(FD)单向传输字节流。

一、pipe 是什么?

特性说明
本质内核中的环形缓冲区,存在于 RAM 中
方向单向(半双工):数据只能从一个方向流动
顺序FIFO(先进先出)
生命周期随进程结束而销毁,不持久化到磁盘
创建pipe()系统调用创建 2 个 FD

二、核心 API

#include<unistd.h>intpipe(intpipefd[2]);// pipefd[0] = 读端(read end)// pipefd[1] = 写端(write end)// 现代版本:intpipe2(intpipefd[2],intflags);// flags: O_NONBLOCK(非阻塞), O_CLOEXEC(执行时关闭)// 示例:intfd[2];pipe(fd);// 或 pipe2(fd, O_NONBLOCK | O_CLOEXEC)write(fd[1],"Hello",5);// 向写端写入read(fd[0],buf,100);// 从读端读取

三、架构图

四、内核实现:环形缓冲区

// Linux Kernel: fs/pipe.cstructpipe_inode_info{structmutexmutex;structpipe_buffer*bufs;// 环形缓冲区数组unsignedinthead;// 写指针unsignedinttail;// 读指针unsignedintring_size;// 缓冲区大小(默认 16 页 = 64KB)structpage*tmp_page;structfasync_struct*fasync_readers;structfasync_struct*fasync_writers;structinode*inode;structuser_struct*user;};

关键点:

  • 内核分配一个页(page)数组作为缓冲区
  • 默认大小:16 页 = 64KB(PIPE_BUF)
  • 写指针和读指针维护 FIFO 顺序
  • 缓冲区满时,write() 阻塞(默认)或返回 EAGAIN(非阻塞)

五、阻塞 vs 非阻塞行为

场景阻塞模式(默认)非阻塞模式(O_NONBLOCK)
read()时缓冲区为空阻塞,直到有数据返回-1,errno = EAGAIN
write()时缓冲区满阻塞,直到有空间返回-1,errno = EAGAIN
write() < PIPE_BUF原子写入(全有或全无)原子写入
write() > PIPE_BUF可能拆分写入可能拆分写入

六、pipe 在 Android Looper 中的应用(Legacy)

旧版 Android(Android 5.0 之前)用 pipe 实现 Looper 的线程唤醒:

// system/core/libutils/Looper.cpp (Legacy)Looper::Looper(boolallowNonCallbacks){// 创建 pipeintwakeFds[2];pipe(wakeFds);// or pipe2(wakeFds, O_CLOEXEC)mWakeReadPipeFd=wakeFds[0];// 读端mWakeWritePipeFd=wakeFds[1];// 写端// 将读端注册到 epollstructepoll_eventeventItem;eventItem.events=EPOLLIN;eventItem.data.fd=mWakeReadPipeFd;epoll_ctl(mEpollFd,EPOLL_CTL_ADD,mWakeReadPipeFd,&eventItem);}voidLooper::wake(){// 向写端写入 1 字节,触发 epoll_wait 返回write(mWakeWritePipeFd,"W",1);}voidLooper::awoken(){// 从读端读取,清空 pipecharbuffer[16];read(mWakeReadPipeFd,buffer,sizeof(buffer));}

七、为什么 Android 从 pipe 切换到 eventfd?

对比项pipeeventfd
FD 数量2(读+写)1
内核缓冲区2 个 ring buffer1 个 64 位计数器
原子性不保证保证 64 位原子操作
系统调用开销pipe()+ 2 次fcntl()eventfd()一次
适用场景数据传输简单通知
Android 使用Legacy(pre-5.0)Modern(5.0+)

eventfd 更适合"通知"场景,因为它就是设计来做轻量级事件通知的。

八、常见使用场景

场景说明
Shell 管道`lsgrep txt—ls的 stdout 通过 pipe 连接到grep` 的 stdin
父子进程通信fork()后,pipe()让父子进程交换数据
Android LooperLegacy 唤醒机制(已被 eventfd 替代)
自管道技巧信号处理中,信号处理函数向 pipe 写,主循环从 pipe 读,避免信号处理中的异步问题

九、总结

pipe 是 Linux 内核提供的单向字节流 IPC 机制,通过 pipe() 创建两个文件描述符(fd[0] 读端、fd[1] 写端),数据在内核环形缓冲区中按 FIFO 顺序流动。旧版 Android Looper 用 pipe 实现线程唤醒(写端触发 epoll_wait 返回),现代 Android 用更高效的 eventfd 替代了 pipe。

相关新闻

  • 微信小程序渲染层网络层错误排查:从 WXSS 图片到视频组件的 3 类常见根因与修复
  • Unity GraphView 与 IMGUI 节点编辑器对比:3 大维度性能与开发效率实测
  • 终极Monaspace编程字体完整指南:如何提升代码可读性与开发效率

最新新闻

  • 2026年茂名老山檀香厂家推荐:这3家品质靠谱值得信赖
  • 媒体流与轨道:MediaStream 与 MediaStreamTrack
  • Understat Python库:构建专业级足球数据分析系统的完整指南
  • Claude Code 的可恢复性机制
  • KES 监控与运维自动化实战:性能指标采集、告警体系与智能运维
  • REPENTOGON:如何为《以撒的结合:悔改》安装终极脚本扩展器?

日新闻

  • Android逆向分析全能助手:集成化工具链与自动化工作流设计
  • 面搜索(Faceted Search)原理与工程实践指南
  • 神经网络调参避坑指南:从5个常见Loss曲线形态定位超参数问题

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号