news 2026/8/28 3:40:58

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/8/28 19:16:27

OpenSCA-cli终极使用指南:从安装到实战

OpenSCA-cli终极使用指南&#xff1a;从安装到实战 【免费下载链接】OpenSCA-cli OpenSCA 是一款开源的软件成分分析工具&#xff0c;用于扫描项目的开源组件依赖、漏洞及许可证信息&#xff0c;为企业及个人用户提供低成本、高精度、稳定易用的开源软件供应链安全解决方案。 …

作者头像 李华
网站建设 2026/8/29 1:54:51

37、深入解析 Linux 系统安全防护策略

深入解析 Linux 系统安全防护策略 1. 引言 在当今数字化时代,Linux 系统凭借其开源、稳定、高效等特性,被广泛应用于各种领域。然而,随着网络攻击的日益猖獗,Linux 系统的安全问题变得尤为重要。本文将详细介绍 Linux 系统安全的多个方面,并提供相应的防护措施。 2. 基…

作者头像 李华
网站建设 2026/8/28 10:12:21

40、Linux 系统故障排除指南

Linux 系统故障排除指南 在 Linux 系统管理中,故障排除是一项至关重要的技能。当系统进程或应用程序停止运行,用户无法正常工作时,管理员必须尽快解决问题。本文将为你介绍 Linux 故障排除的基础知识、最佳实践方法以及可用的故障排除资源。 一、故障识别与定位 在进行故…

作者头像 李华
网站建设 2026/8/27 14:04:39

驻马店惊现!这家家电门店竟承诺全程包维修!

驻马店惊现&#xff01;这家家电门店竟承诺全程包维修&#xff01;在驻马店的家电市场中&#xff0c;消费者们常常为家电的购买和后续维修问题而烦恼。近期&#xff0c;驻马店一家家电门店却凭借全程包维修的承诺&#xff0c;迅速吸引了众多消费者的目光&#xff0c;它就是驻马…

作者头像 李华
网站建设 2026/8/26 21:03:44

HoRain云--MySQL日志管理:数据库运维的7大神器

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华