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

Linux 基础入门操作 第九章 进程间通信之有名管道

1 有名管道介绍

有名管道(Named Pipe),也称为 FIFO(First In First Out),是 Linux 进程间通信(IPC)的一种方式。FIFO 不同于管道之处在于它提供一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中。这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信(能够访问该路径的进程以及 FIFO 的创建进程之间),因此,通过 FIFO 不相关的进程也能交换数据。

它与匿名管道的核心区别在于:

  1. 匿名管道 仅适用于 有亲缘关系的进程(如父子进程),而 有名管道 允许 任意进程(即使无亲缘关系)通过文件系统路径进行通信。

  2. 有名管道 在文件系统中有一个 持久化的节点(类似于文件),而匿名管道是临时的,仅存在于内存中。

2 shell 编程应用

  1. 打开一个 终端A 发送信息
# 创建命名管道
mkfifo mypipe
# 进程 A 写入数据
echo "Hello from Process A" > mypipe
  1. 打开一个终端B 接收信息
# 进程 B 读取数据
cat mypipe
  1. 在终端A或者终端B中要删除有名管道,需要手动删除
rm mypipe

3 进程中有名管道用到函数

3.1 mkfifo 函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int mkfifo(const char * pathname, mode_t mode)
  1. 其中输入形参:
    pathname:FIFO 文件的路径(如 “/tmp/myfifo”)。
    mode:权限模式(如 0666,表示所有用户可读写), mkfifo()建立的 FIFO 文件其他进程都可以用读写一般文件的方式存取。

具体案例如下:

mkfifo("/tmp/myfifo", S_IFIFO | 0666);  // S_IFIFO 可省略,因 mkfifo 已隐含
  1. 返回值:
    成功返回 0,失败返回 -1 并设置 errno。
  2. mkfifo()会依参数 pathname 建立特殊的 FIFO 文件,该文件必须不存在。

3.2 删除函数

  1. 可以利用停止信号,来触发删除函数,否则需要手动删除
unlink(const char * pathname);  // 删除 FIFO 文件
  1. 有可能存在残留的情况,最好程序启动的时候,删除残留。
if (access("/tmp/myfifo", F_OK) == 0) {
   
    unlink("/tmp/myfifo");
}

3.3 其它文件操作函数说明

  1. 只读方式打开,默认阻塞模式
int fd = open("/tmp/myfifo", O_RDONLY ); // 阻塞模式打开
  1. 只读方式打开,采用非阻塞方式
int fd = open("/tmp/myfifo", O_RDONLY | O_NONBLOCK); // 非阻塞模式打开
  1. 以只写方式打开,默认采用阻塞模式
int fd = open("/tmp/myfifo", O_WRONLY ); // 阻塞模式打开

如果没有写入端,open() 会 立即返回 -1,并设置 errno = ENXIO。

3.4 阻塞与非阻塞模式说明

在这里插入图片描述

3.5 注意事项

  1. 需要轮询(polling)的 IPC 通信。

  2. 避免死锁(如双向通信时双方都在等待对方)。

  3. 如果需要双工通讯,需要创建两个管道。

3.6 总结

在这里插入图片描述

4 代码演示

4.1 单工通讯

4.1.1 发送端

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>

#define FIFO_PATH "/tmp/myfifo"

int ma
http://www.dtcms.com/a/108095.html

相关文章:

  • el-select+el-tree、el-select+vl-tree实现下拉树形选择
  • Linux中进程与计划任务
  • SpringMvc获取请求数据
  • HTML5 Canvas绘画板项目实战:打造一个功能丰富的在线画板
  • 配置 UOS/deepin 系统远程桌面,实现多台电脑协同办公
  • PHP 8.x:现代Web开发的性能与效率革命
  • 解码 __getitem__ 和 __len__ - 自定义序列的钥匙
  • Prompt攻击是什么
  • Go和Golang语言简介
  • 快速排序与归并排序
  • 【硬件视界10】网络硬件入门:音频设备详解:声卡与音响系统
  • 【区块链 + 可信存证】国链区块链可信存证系统| FISCO BCOS 应用案例
  • 使用Qemu模拟32位ARM系统
  • OpenCV图像形态学:原理、操作与应用详解
  • 前端实现单点登录(SSO)的方案
  • Pycharm(十二)列表练习题
  • mac环境中Nginx安装使用 反向代理
  • 通俗解释 TCP 的三次握手、四次挥手
  • 《深度探索:数据库树形数据遍历与节点更新的游标之道》
  • 在PyTorch中使用GPU加速:从基础操作到模型部署
  • React-01React创建第一个项目(npm install -g create-react-app)
  • 【扣子agent入门】搭建计算热量工作流
  • 【QT】构建项目
  • DIY搭建网站(学术个人介绍主页)
  • 2025年大模型与Transformer架构:重塑AI未来的科技革命
  • docker的入门以及使用
  • unity运行中场景指定模型回放功能(模型是地形并且可以加载预制体进行回放)
  • Java面试黄金宝典30
  • 无需安装Office进行 Word、Excel操作的微软开发库
  • MySQL 锁机制:数据库的交通管制系统