命名管道(Named Pipe)是一种在操作系统中用于进程间通信(IPC) 的机制,它允许不相关的进程(甚至不同用户的进程)通过一个可见的文件系统路径进行数据交换。与匿名管道(仅存在于内存,且只能用于父子进程间通信)不同,命名管道有一个持久化的文件系统入口,因此适用范围更广。

核心特性

  1. 文件系统可见性
    命名管道在文件系统中以特殊文件的形式存在(类型为 p,可通过 ls -l 查看),路径通常由用户指定(如 /tmp/my_pipe)。进程通过打开该路径来连接管道。

  2. 双向或单向通信
    支持半双工(默认,数据单向流动)或全双工(需特殊配置)通信,具体取决于打开方式(读/写模式)。

  3. 阻塞特性

    • 若进程以只读模式打开管道,会阻塞直到另一个进程以写模式打开它。
    • 若进程以只写模式打开管道,会阻塞直到另一个进程以读模式打开它。
    • 读写操作也可能阻塞(如管道为空时读操作阻塞,管道满时写操作阻塞)。
  4. 跨进程通信
    可用于任意进程间(包括无亲缘关系的进程、不同用户的进程,甚至跨网络的进程,如通过 NFS 共享的命名管道)。

命名管道的创建与使用(以 Linux 为例)

1. 命令行创建(mkfifo)

通过 mkfifo 命令可直接在文件系统中创建命名管道:

mkfifo /tmp/my_named_pipe  # 创建命名管道
ls -l /tmp/my_named_pipe   # 查看类型(显示为 p 开头)
# 输出示例:prw-r--r-- 1 user user 0 8月 10 10:00 /tmp/my_named_pipe
2. 编程创建(C 语言)

使用 mkfifo() 系统调用在程序中创建:

#include <sys/stat.h>  // 包含 mkfifo 声明int main() {const char *pipe_path = "/tmp/my_pipe";mode_t mode = 0666;  // 权限:允许读写// 创建命名管道,成功返回 0,失败返回 -1if (mkfifo(pipe_path, mode) == -1) {perror("mkfifo failed");return 1;}return 0;
}

进程通信示例(读写操作)

命名管道的通信流程通常是:一个进程写数据,另一个进程读数据,通过文件操作函数(openreadwriteclose)实现。

写进程(发送数据)
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {const char *pipe_path = "/tmp/my_pipe";const char *msg = "Hello from writer!";// 以只写模式打开管道(O_WRONLY)int fd = open(pipe_path, O_WRONLY);if (fd == -1) {perror("open failed");return 1;}// 向管道写入数据write(fd, msg, strlen(msg));printf("Writer sent: %s\n", msg);close(fd);  // 关闭管道return 0;
}
读进程(接收数据)
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {const char *pipe_path = "/tmp/my_pipe";char buf[1024];ssize_t bytes_read;// 以只读模式打开管道(O_RDONLY)int fd = open(pipe_path, O_RDONLY);if (fd == -1) {perror("open failed");return 1;}// 从管道读取数据bytes_read = read(fd, buf, sizeof(buf)-1);if (bytes_read > 0) {buf[bytes_read] = '\0';  // 手动添加字符串结束符printf("Reader received: %s\n", buf);}close(fd);  // 关闭管道return 0;
}

运行方式

  1. 先运行读进程(会阻塞等待写进程连接)。
  2. 再运行写进程(发送数据后,读进程会立即接收并输出)。

关键注意事项

  1. 管道生命周期
    命名管道的文件系统入口在创建后会一直存在,直到被 unlink()rm 命令删除。即使所有进程关闭管道,文件路径仍保留。

  2. 阻塞与非阻塞
    默认情况下,openreadwrite 操作会阻塞。若需非阻塞模式,可在 open 时添加 O_NONBLOCK 标志:

    int fd = open(pipe_path, O_RDONLY | O_NONBLOCK);  // 非阻塞读
    
  3. 数据传输特性

    • 数据是流式的(无消息边界),读进程需自行处理数据分割(如约定换行符为结束标志)。
    • 数据一旦被读取就会从管道中移除,不会像普通文件那样保留。
  4. 权限控制
    创建时的 mode 参数(如 0666)会结合进程的 umask 确定最终权限,需确保通信进程有足够的读写权限。

  5. 与匿名管道的对比

    特性命名管道(Named Pipe)匿名管道(Anonymous Pipe)
    存在形式文件系统中的特殊文件内存中的文件描述符
    通信范围任意进程(包括无亲缘关系)仅限父子/兄弟进程
    创建方式mkfifo()mkfifo 命令pipe() 系统调用
    持久性管道文件持久存在,直到删除进程退出后自动销毁

应用场景

  • 命令行工具间的通信(如 mkfifo 结合 catecho 等命令)。
  • 后台服务程序与前端程序的交互(如服务器进程接收客户端命令)。
  • 日志收集(多个进程向管道写入日志,一个进程统一处理)。

命名管道是一种简单高效的 IPC 机制,适用于需要跨进程传递流式数据的场景,但其功能相对基础,复杂场景可能需要结合消息队列、共享内存等其他 IPC 方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918353.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918353.shtml
英文地址,请注明出处:http://en.pswp.cn/news/918353.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Baumer相机如何通过YoloV8深度学习模型实现危险区域人员的实时检测识别(C#代码UI界面版)

《------往期经典推荐------》 AI应用软件开发实战专栏【链接】 序号 项目名称 项目名称 1 1.工业相机 + YOLOv8 实现人物检测识别:(C#代码,UI界面版) 2.工业相机 + YOLOv8 实现PCB的缺陷检测:(C#代码,UI界面版) 2 3.工业相机 + YOLOv8 实现动物分类识别:(C#代码,U…

本文章分享一个本地录音和实时传输录音给app的功能(杰理)

我用的是杰理手表sdk&#xff0c;该功能学会就可自行在任何杰里sdk上做&#xff0c;库函数大致一样&#xff0c;学会运用这个方向就好。1.我们要验证这个喇叭和麦是否正常最简单的的办法&#xff0c;就是直接万用表测试&#xff0c;直接接正负极&#xff0c;看看是否通路&#…

Netty-Rest搭建笔记

0.相关知识Component、Repository、ServiceRepository //Scope设置bean的作用范围 Scope("singleton")//单例 prototype每次创建都会给一个新实例。 public class BookDaoImpl implements BookDao { //生命周期public void save() {System.out.println("book d…

工作笔记-----lwip网络任务初始化问题排查

工作笔记-----基于FreeRTOS的lwIP网络任务初始化问题排查 Author&#xff1a;明月清了个风Date&#xff1a; 2025/8/10PS&#xff1a;新项目中在STMF7开发板上基于freeRTOS和lwIP开发网口相关任务&#xff0c;开发过程中遇到了网口无法连接的问题&#xff0c;进行了一系列的排查…

Kotlin动态代理池+无头浏览器协程化实战

我看到了很多作者展示了Kotlin在爬虫领域的各种高级用法。我需要从中提取出最"牛叉"的操作&#xff0c;也就是那些充分利用Kotlin语言特性&#xff0c;使爬虫开发更高效、更强大的技巧。 我准备用几个主要部分来组织内容&#xff0c;每个部分会突出Kotlin特有的"…

PDF编辑工具,免费OCR识别表单

软件介绍 今天推荐一款功能全面的PDF编辑工具——PDF XChange Editor&#xff0c;支持文本、图片编辑及OCR识别&#xff0c;还能一键提取表单信息&#xff0c;满足多样化PDF处理需求。 软件优势 该软件完全免费&#xff0c;下载后双击图标即可直接运行&#xff0c;无需安装&…

OpenEnler等Linux系统中安装git工具的方法

在欧拉系统中安装 Git使用 yum 包管理器安装&#xff08;推荐&#xff0c;适用于欧拉等基于 RPM 的系统&#xff09;&#xff1a;# 切换到 root 用户&#xff08;若当前不是&#xff09; su - root# 安装 Git yum install -y git验证安装是否成功&#xff1a;git --version若输…

UE5 第三人称视角如何设置camera移动旋转

“奇怪&#xff0c;这blog不支持md格式吗”## 第1步&#xff1a;设置玩家Pawn 创建一个蓝图类&#xff0c;继承自 Pawn&#xff0c;在游戏模式&#xff08;Game Mode&#xff09;中&#xff0c;将这个Pawn设置为默认 在组件面板中&#xff0c;添加一个 Spring Arm 组件 在组件面…

OpenCV 入门教程:开启计算机视觉之旅

目录 一、引言​ 二、OpenCV 简介 ​&#xff08;一&#xff09;什么是 OpenCV &#xff08;二&#xff09;OpenCV 的特点与优势 &#xff08;三&#xff09;OpenCV 的应用领域 三、环境搭建 &#xff08;一&#xff09;安装 OpenCV 库​ 四、OpenCV 基础操作 &#xf…

C++高频知识点(十九)

文章目录91. TCP断开连接的时候为什么必须4次而不是3次&#xff1f;92. 为什么要区分用户态和内核态&#xff1f;93. 说说编写socket套接字的步骤1. 服务器端编写步骤1.1 创建套接字1.2 绑定套接字1.3 监听连接1.4 接受连接1.5 数据传输1.6 关闭套接字2. 客户端编写步骤2.1 创建…

一个基于 epoll 实现的多路复用 TCP 服务器程序,相比 select 和 poll 具有更高的效率

/*5 - 使用epoll实现多路复用 */ #include <stdio.h> // 标准输入输出函数库 #include <stdlib.h> // 标准库函数&#xff0c;包含exit等 #include <string.h> // 字符串处理函数 #include <unistd.h> // Unix标准函…

元数据管理与数据治理平台:Apache Atlas 通知和业务元数据 Notifications And Business Metadata

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。Apache Atlas 框架是一套可扩展的核心基础治理服务&#xff0c;使企业能够有效、高效地满足 Hadoop 中的合规性要求&#xff0c;并支持与整个企…

rem:CSS中的相对长度单位

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

【10】C#实战篇——C# 调用 C++ dll(C++ 导出函数、C++导出类)

文章目录1 导出C 类函数 、导出 C函数1.1 .h文件1.2 .cpp 文件1.3 C# 调用2 C与C#数据类型对应3 保姆级教程&#xff08;项目搭建、代码、调用&#xff0c;图文并茂&#xff09;1 导出C 类函数 、导出 C函数 C 生成动态库.dll 详细教程&#xff1a; C 生成动态库.dll 及 C调用…

Flutter 与 Android NDK 集成实战:实现高性能原生功能

Flutter 与 NDK 集成实现 Flutter 可以通过 Platform Channels 与原生代码&#xff08;包括使用 NDK 编写的 C/C 代码&#xff09;进行交互。以下是实现 Flutter 与 NDK 集成的步骤&#xff1a; 基本步骤 1. 创建 Flutter 项目 flutter create flutter_ndk_example cd flutter_…

elementui cascader 远程加载请求使用 选择单项等

背景&#xff1a;小程序与后端使用自定义表单渲染视图。发现若没有全选&#xff08;如&#xff1a;省市县全部选择&#xff0c;指定的市3级&#xff09;在pc端就会无法渲染出已经选择的区县名称。 解决方案&#xff1a;参考官方文档&#xff0c;设置属性可独立勾选element ui c…

Unity WebGL打包后启动方法,本地方法

引言&#xff1a;常见WebGL开启方法常需要重新打包点击Build and Run或者将游戏放到Unity的云服务器上&#xff0c;作为开发者而言这两个方案一个为了开启再次打包&#xff0c;另一个直接放到了公开环境都不太合适。所以我们需要一个能在本地开启测试的WebGL的方法。 解决方案 …

安全引导功能及ATF的启动过程(五)

安全引导功能及ATF的启动过程&#xff08;五&#xff09; ATF中bl32的启动 bl31中的runtime_svc_init函数会初始化OP-TEE对应的服务&#xff0c;通过调用该服务项的初始化函数来完成OP-TEE的启动。对于OP-TEE的服务项会通过DECLARE_RT_SVC宏在编译时被存放到rt_svc_des段中。该…

Numpy科学计算与数据分析:Numpy入门之多平台安装与基础环境配置

Numpy环境搭建与基础操作 学习目标 本课程将指导学员在Windows、macOS和Linux三种操作系统上安装Numpy&#xff0c;并配置开发环境&#xff0c;包括使用Jupyter Notebook和Spyder等IDE的基本操作。通过本课程的学习&#xff0c;学员将能够独立搭建Numpy开发环境&#xff0c;并…

内存溢出的原因有哪些,如何排查线上问题?

1. java.lang.OutOfMemoryError: ......java heap space..... 堆栈溢出&#xff0c;代码问题的可能性极大 2. java.lang.OutOfMemoryError: GC over head limit exceeded 系统处于高频的GC状态&#xff0c;而且回收的效果依然 不佳的情况&#xff0c;就会开始报这个错误&…