news 2026/4/23 12:10:30

Linux 有名管道fifo进程间通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 有名管道fifo进程间通信

函数原型

/** * int mkfifo(const char *pathname, mode_t mode); * * @brief 用于创建有名管道。该函数可以创建一个路径为pathname的FIFO专用文件,mode指定了FIFO的权限,FIFO的权限和它绑定的文件是一致的。FIFO和pipe唯一的区别在于创建方式的差异。一旦创建了FIFO专用文件,任何进程都可以像操作文件一样打开FIFO,执行读写操作。 * * @param pathname 有名管道绑定的文件路径 * @param mode 有名管道绑定文件的权限 * @return int */

接下来写一段发送端代码,以及接收端代码演示

发送端代码:

#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> /** * int mkfifo(const char *pathname, mode_t mode); * * @brief 用于创建有名管道。该函数可以创建一个路径为pathname的FIFO专用文件,mode指定了FIFO的权限,FIFO的权限和它绑定的文件是一致的。FIFO和pipe唯一的区别在于创建方式的差异。一旦创建了FIFO专用文件,任何进程都可以像操作文件一样打开FIFO,执行读写操作。 * * @param pathname 有名管道绑定的文件路径 * @param mode 有名管道绑定文件的权限 * @return int */ int main(int argc, char const *argv[]) { char* fifo_path = "/tmp/myfifo"; //fifo专用文件 //创建有名管道 if(mkfifo(fifo_path,0664) != 0) { if (errno != EEXIST) { // 如果不是因为文件已存在,才是真错误 perror("mkfifo failed"); exit(EXIT_FAILURE); } } //打开有名管道用于写入 int fd = open(fifo_path,O_WRONLY); if(fd == -1) { perror("open fail"); exit(EXIT_FAILURE); } char write_buf[100]; ssize_t read_num; //从控制台读取输入 while((read_num = read(STDIN_FILENO,write_buf,sizeof(write_buf))) > 0) { //写入fifo管道 write(fd,write_buf,read_num); } if(read_num < 0) { perror("read"); close(fd); exit(EXIT_FAILURE); } close(fd); printf("发送端退出\n"); unlink(fifo_path); return 0; }

接收端代码:

#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <fcntl.h> /** * int mkfifo(const char *pathname, mode_t mode); * * @brief 用于创建有名管道。该函数可以创建一个路径为pathname的FIFO专用文件,mode指定了FIFO的权限,FIFO的权限和它绑定的文件是一致的。FIFO和pipe唯一的区别在于创建方式的差异。一旦创建了FIFO专用文件,任何进程都可以像操作文件一样打开FIFO,执行读写操作。 * * @param pathname 有名管道绑定的文件路径 * @param mode 有名管道绑定文件的权限 * @return int */ int main(int argc, char const *argv[]) { char* fifo_path = "/tmp/myfifo"; //fifo专用文件 //打开有名管道用于读取 int fd = open(fifo_path,O_RDONLY); if(fd == -1) { perror("open fail"); exit(EXIT_FAILURE); } char read_buf[100]; ssize_t read_num; //从管道文件描述符中读取 while((read_num = read(fd,read_buf,sizeof(read_buf))) > 0) { //输出到控制台 write(STDOUT_FILENO,read_buf,read_num); } if(read_num < 0) { perror("read"); close(fd); exit(EXIT_FAILURE); } close(fd); printf("接收端退出\n"); return 0; }

运行两个程序演示通信

左边为发送端,右边为接收端

动画讲解

这边用ai 生成动画以便大家理解

1. "有名" 的意义 (The Name is the Rendezvous Point)

无名管道(pipe)之所以只能在父子进程间使用,是因为它只存在于内存中,没有名字,其他进程根本“指不到”它。

  • FIFO 的突破mkfifo在文件系统中创建了一个节点/tmp/myfifo)。

  • 这个文件就像一个公开的接头地点

  • 发送端和接收端不需要互为父子,它们只要大家都约定好去/tmp/myfifo这个地方,就能建立连接。

  • 注意:虽然它在磁盘上有个文件,但数据本身是不存硬盘的。那个文件只是一个“路标”,数据依然是在内核内存中流动。

2. 打开时的阻塞机制 (Blocking on Open)

这是代码中最容易让人困惑的地方(动画步骤 3):

  • 规则:FIFO 必须读写两端同时打开才能开始工作。

  • 如果你写了一个程序只调用open(path, O_WRONLY),而没有另一个程序去O_RDONLY,那么open函数会卡住(阻塞),直到另一个程序出现。

  • 这是一种天然的同步机制,保证了在写入数据之前,接收端已经准备好接收了。

3. 像操作文件一样操作管道

代码中使用了open,read,write,close,这些全是标准的文件 I/O 操作。

  • Linux 的哲学是"一切皆文件"

  • 内核把管道伪装成了一个文件,让程序员可以用熟悉的文件操作接口来收发数据,而不需要学习新的 API。

无名管道 vs 有名管道
特性无名管道 (Pipe)有名管道 (FIFO)
存在形式仅存在于内存,无文件路径在文件系统中有路径(如/tmp/myfifo
通信范围仅限父子、兄弟等有亲缘关系的进程任意两个进程,只要能访问该文件路径
创建方式pipe()mkfifo()命令或函数
数据流单向字节流单向字节流
持久性进程结束即销毁文件节点一直存在,直到unlink
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 4:00:35

TikTok直播录制全攻略:从入门到精通的完整解决方案

在内容创作蓬勃发展的今天&#xff0c;TikTok直播已成为创作者与粉丝深度互动的重要渠道。然而&#xff0c;直播内容的即时性往往让精彩瞬间转瞬即逝&#xff0c;让无数用户深感遗憾。现在&#xff0c;一款强大的开源录制工具横空出世&#xff0c;完美解决了这一痛点&#xff0…

作者头像 李华
网站建设 2026/4/23 6:05:10

SDXL VAE FP16修复版完全指南:从数值稳定性到高效推理

SDXL VAE FP16修复版完全指南&#xff1a;从数值稳定性到高效推理 【免费下载链接】sdxl-vae-fp16-fix 项目地址: https://ai.gitcode.com/hf_mirrors/madebyollin/sdxl-vae-fp16-fix SDXL-VAE-FP16-Fix是一个专门针对Stable Diffusion XL模型变分自编码器的FP16精度修…

作者头像 李华
网站建设 2026/4/21 17:28:39

44、Linux系统故障排查与常见用户问题解决

Linux系统故障排查与常见用户问题解决 1. 双系统启动问题及解决方法 在安装了可双启动Windows和Linux的系统后,有时会遇到在LILO提示符下没有启动Windows分区选项的情况。要解决这个问题,需要对Linux进行配置,具体方法是在 /etc/lilo.conf 文件中添加Windows部分,完成后…

作者头像 李华
网站建设 2026/4/17 22:59:58

45、Linux系统故障排查与维护全攻略

Linux系统故障排查与维护全攻略 在Linux系统的使用过程中,我们难免会遇到各种各样的问题,如打印故障、邮件问题、软件包安装问题、备份恢复错误、应用程序故障以及网络连接问题等。本文将详细介绍这些常见问题的排查方法和解决策略。 打印问题排查 行式打印机守护进程(lp…

作者头像 李华
网站建设 2026/4/23 12:01:43

53、软件许可协议解读与自由软件许可条款分析

软件许可协议解读与自由软件许可条款分析 1. 商业软件许可协议概述 当你准备使用一款商业软件时,通常会遇到一份许可协议。以某商业软件为例,它是你与软件提供方之间的一份约定。在打开软件包之前,你需要仔细阅读相关的条款和条件。如果你打开了软件包,就意味着你已阅读并…

作者头像 李华
网站建设 2026/4/22 3:00:02

MCP协议优势全解析:一文了解其在AI应用中的关键作用!

简介 微软Teams通过MCP协议实现与第三方应用深度集成&#xff0c;MCP通过统一接口、跨平台兼容和协议解耦三大优势&#xff0c;打破不同厂商生态壁垒&#xff0c;实现大模型、工具与平台的互联互通&#xff0c;让开发者能够灵活选择最佳技术组合而不必重构业务逻辑。 2025 年 …

作者头像 李华