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

linux有名管道

有名管道(Named Pipe,也称为 FIFO) 也是在内核中实现的。与无名管道(Anonymous Pipe)类似,有名管道是一种用于进程间通信(IPC)的机制,但有名管道具有以下特点:


1. 有名管道在内核中的实现

  • 有名管道在内核中作为一个特殊的文件类型存在。

  • 它通过文件系统的一个路径名(如 /tmp/my_fifo)来标识,因此可以被不相关的进程访问。

  • 内核负责管理有名管道的创建、打开、读写和关闭等操作。


2. 有名管道的特点

  • 有名称:有名管道在文件系统中有一个路径名,因此可以被多个不相关的进程访问。

  • 持久性:有名管道在文件系统中存在,直到被显式删除(例如使用 unlink() 系统调用)。

  • 双向通信:有名管道通常是半双工的(数据只能单向流动),但在某些系统(如 Linux)中可以通过打开两次实现双向通信。


3. 有名管道的使用

有名管道的使用通常包括以下步骤:

(1)创建有名管道

使用 mkfifo 命令或 mkfifo() 系统调用创建有名管道:

mkfifo /tmp/my_fifo
或者在 C 程序中:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
(2)打开有名管道

使用 open() 系统调用打开有名管道:

int fd = open("/tmp/my_fifo", O_RDONLY);  // 以只读方式打开
int fd = open("/tmp/my_fifo", O_WRONLY);  // 以只写方式打开
 
(3)读写有名管道

使用 read() 和 write() 系统调用进行通信:

char buf[128];
read(fd, buf, sizeof(buf));  // 从管道读取数据
write(fd, "Hello", 6);       // 向管道写入数据
(4)关闭和删除有名管道

使用 close() 关闭文件描述符,使用 unlink() 删除有名管道:

close(fd);
unlink("/tmp/my_fifo");
 

4. 有名管道与无名管道的区别

特性有名管道(FIFO)无名管道(Anonymous Pipe)
名称有文件名(在文件系统中可见)无文件名
进程关系可用于任意进程间通信通常用于父子进程或兄弟进程间通信
持久性持久存在,直到显式删除随进程结束而销毁
创建方式使用 mkfifo() 或 mkfifo 命令使用 pipe() 系统调用
通信方向通常是半双工半双工

5. 有名管道在内核中的实现细节

  • 有名管道在内核中通过 虚拟文件系统(如 pipefs 实现。

  • 内核会为每个有名管道维护一个缓冲区,用于存储进程间传递的数据。

  • 当进程尝试从空管道读取数据时,内核会阻塞该进程,直到有数据写入。

  • 当进程尝试向已满管道写入数据时,内核会阻塞该进程,直到有空间可用。


6. 总结

有名管道是内核实现的一种进程间通信机制,通过文件系统路径名标识,允许不相关的进程进行通信。它的实现依赖于内核的虚拟文件系统和缓冲区管理机制。


http://www.kler.cn/a/558086.html

相关文章:

  • 鸿蒙开发技术指南:从入门到精通
  • LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
  • 技术解析 | 适用于TeamCity的Unreal Engine支持插件,提升游戏构建效率
  • netty基础知识梳理和总结
  • 数据库面试知识点总结
  • [Android]浏览器下载的apk文件无法识别无法安装问题
  • 《AI与NLP:开启元宇宙社交互动新纪元》
  • Django 连接(sqlserver)数据库方法
  • SHELL32!Shell_MergeMenus函数分析
  • 蓝桥杯拔河问题(前缀和与差分,multiset,区间冲突)
  • 基于Transformer的语音障碍分析方法
  • MAC快速本地部署Deepseek (win也可以)
  • 工业机器视觉的“眼睛”:如何利用镜头获取精准图像
  • [含文档+PPT+源码等]精品大数据项目-Django基于机器学习实现的市区游客满意度可视化分析系统
  • 【论文阅读】SAM-CP:将SAM与组合提示结合起来的多功能分割
  • Uniapp 设计思路全分享
  • DeepSeek R1/V3满血版——在线体验与API调用
  • Error [ERR_REQUIRE_ESM]: require() of ES Module
  • MySQL的Union和OR查询
  • Vite 和 Webpack 的区别和选择