命名管道和匿名管道

news/2026/1/20 10:37:13/文章来源:https://www.cnblogs.com/tong2357/p/19505273

命名管道

命名管道(Named Pipe)是一种特殊类型的文件,它以文件系统路径为标识,允许任意两个进程(无论是否有亲缘关系)通过读写该路径进行数据交换。其本质是内核维护的一个内存缓冲区,遵循“先进先出”(FIFO)原则
命名管道的核心是内核缓冲区与文件系统接口的结合。

创建管道:通过 mkfifo 命令或 mkfifo() 系统调用在文件系统中创建一个特殊文件(类型标识为 p,可通过 ls -l 查看)。
创建时通过 mkfifo -m 600 /tmp/myfifo 设置权限,仅允许所有者读写,防止未授权进程访问。
若以只读(O_RDONLY)打开,open() 会阻塞,直到另一个进程以只写(O_WRONLY)打开该管道。
若以只写(O_WRONLY)打开,open() 同样会阻塞,直到另一个进程以只读打开。
若以读写(O_RDWR)打开,open() 不会阻塞(但不推荐,易引发死锁)。两个进程均以 O_RDWR 打开管道,各自写入后等待读取对方数据,导致永久阻塞。
解决方案:严格使用“一读一写”模式,双向通信分离为两个管道。

数据传输:进程通过 read()/write() 系统调用读写管道:

数据写入时,内核将其暂存于缓冲区,若缓冲区满,write() 会阻塞。
数据读取时,内核从缓冲区提取数据,若缓冲区空,read() 会阻塞。
数据读取后即从缓冲区移除,确保“先进先出”。

关闭与销毁:进程通过 close() 关闭管道,所有进程关闭后缓冲区释放;通过 unlink() 或 rm 命令删除文件系统中的管道路径,彻底销毁管道。

 

示例:基本读写
写入进程(writer.c)#
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>

int main() {
const char *fifo_path = "/tmp/myfifo";
int fd;
char buffer[] = "Hello from C writer!";

// 1. 创建管道(若已存在则忽略错误)
if (mkfifo(fifo_path, 0666) == -1) {
perror("mkfifo failed");
// 若错误为 EEXIST(管道已存在),可继续执行
if (errno != EEXIST) exit(EXIT_FAILURE);
}

// 2. 以只写模式打开管道(会阻塞至读取端打开)
printf("Writer: Waiting for reader...\n");
fd = open(fifo_path, O_WRONLY);
if (fd == -1) {
perror("open failed");
exit(EXIT_FAILURE);
}
printf("Writer: Connected to reader.\n");

// 3. 写入数据
write(fd, buffer, strlen(buffer) + 1); // +1 包含字符串结束符 '\0'
printf("Writer: Data written: %s\n", buffer);

// 4. 关闭管道
close(fd);
printf("Writer: Pipe closed.\n");

return 0;
}

读取进程(reader.c)#
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>

int main() {
const char *fifo_path = "/tmp/myfifo";
int fd;
char buffer[1024];

// 1. 以只读模式打开管道(会阻塞至写入端打开)
printf("Reader: Waiting for writer...\n");
fd = open(fifo_path, O_RDONLY);
if (fd == -1) {
perror("open failed");
exit(EXIT_FAILURE);
}
printf("Reader: Connected to writer.\n");

// 2. 读取数据
read(fd, buffer, sizeof(buffer));
printf("Reader: Data received: %s\n", buffer);

// 3. 关闭管道
close(fd);
printf("Reader: Pipe closed.\n");

// 4. 清理管道(可选,若需重复使用可省略)
unlink(fifo_path);

return 0;
}
编译与运行:

gcc writer.c -o writer
gcc reader.c -o reader

# 终端 1 运行读取端
./reader # 输出:Reader: Waiting for writer...

# 终端 2 运行写入端
./writer # 输出:Writer: Waiting for reader... → 连接后写入数据


创建管道:
mkfifo /tmp/myfifo # 在 /tmp 目录下创建名为 myfifo 的管道
ls -l /tmp/myfifo # 查看类型:prw-r--r--(p 表示管道)


进程 A(写入端):在终端 1 中执行,此时命令会阻塞,等待读取端打开管道:
echo "Hello from Process A" > /tmp/myfifo # 向管道写入数据


进程 B(读取端):在终端 2 中执行,读取并输出管道数据,此时终端 1 的阻塞解除:
cat < /tmp/myfifo # 从管道读取数据,输出:Hello from Process A

清理管道:
rm /tmp/myfifo # 删除管道路径


无名管道
管道是在内核中由环形队列实现的,管道是字节流通信,没有消息边界

读端对应的文件描述符被关闭,write操作会产生信号,SIGPIPE,进而导致write进程退出
当要写入的数据量不大于管道的容量(PIPE_BUF)时,linux将保证写入的原子性
要写入的数据量大于管道容量(PIPE_BUF)时,linux将不再保证写入的原子性
clude <unistd.h>

int pipe(int pipefd[2]);

例子代码:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fds[2];
if(pipe(fds) < 0){//创建一个管道,用于父子间进行通信
perror("pipe");
return 1;
}
char buf[1024];//临时数组,用于存放通信的消息

printf("Please enter:");
fflush(stdout);//对标准输出流的清理,但是它并不是把数据丢掉,而是及时地打印数据到屏幕上
ssize_t s = read(0,buf,sizeof(buf)-1);//0对应文件描述符
if(s > 0){//判断读取的字节数
buf[s] = 0;
}

pid_t pid = fork();//fork()子进程
if(pid == 0){//子进程只写,关闭读端
close(fds[0]);
while(1){
sleep(1);
write(fds[1],buf,strlen(buf));//将buf的内容写入管道
}
}
else{//父进程只读,关闭写端
close(fds[1]);
char buf1[1024];
while(1){
ssize_t s = read(fds[0],buf1,sizeof(buf1)-1);//从管道里读数据,放入buf
if(s > 0){
buf1[s-1] = 0;
printf("client->farther:%s\n",buf1);
}
}
}
}

 

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

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

相关文章

好写作AI|回复“刁钻”审稿意见的智囊:当AI开始“阅读理解”审稿人的潜台词…

收到审稿意见&#xff0c;第一反应不是“怎么改”&#xff0c;而是“他到底想让我干嘛&#xff1f;&#xff01;”——你的AI“学术拆弹专家”已上线&#xff0c;专治各种话中有话。每位经历过同行评审的学术战士&#xff0c;都曾被那封邮件支配过恐惧&#xff1a;点开&#xf…

springboot高校督导听查课支持服务系统

高校督导听查课支持服务系统的背景 高校督导听查课支持服务系统是基于SpringBoot框架开发的数字化管理工具&#xff0c;旨在优化传统教学督导工作的流程。传统督导方式依赖纸质记录和人工统计&#xff0c;存在效率低、数据易丢失、反馈滞后等问题。该系统通过信息化手段整合听…

2026年知名的数控凸轮磨床生产商哪家靠谱?口碑排行 - 品牌宣传支持者

在精密机械加工领域,数控凸轮磨床作为关键设备,其性能直接关系到凸轮轴等核心零部件的加工精度。本文基于设备性能、技术创新能力、市场反馈及售后服务等维度,综合评估当前国内数控凸轮磨床生产商的综合实力。经过对…

知名的服装衬布公司哪家靠谱?2026年行业口碑排行 - 品牌宣传支持者

在服装辅料领域,衬布作为支撑服装廓形与功能性的关键材料,其品质直接影响成衣的耐用性与舒适度。选择靠谱的服装衬布供应商需综合考量企业历史、产能规模、技术实力及市场口碑。根据2026年行业调研数据,如皋市纪林服…

Prodigy AI标注工具v1.18更新详解

Changelog Prodigy 此页面列出了 Prodigy 的历史变更。每当有新的更新可用时&#xff0c;都会向购买时指定的邮箱地址发送邮件通知。然后您可以通过个人下载链接下载新版本。如果您的免费升级已过期&#xff0c;您现在可以通过我们的在线商店为您的许可证添加 12 个月的更新。…

Agent Skill: react-best-practices

背景 Agent Skill 是一个可复用的能力单元&#xff0c;通常包含明确的职责边界、触发条件、输入输出约定&#xff0c;且可能封装了提示词、工具调用逻辑、状态 处理和约束规则。在工程化 Agent 系统中&#xff0c;Skill 更接近“函数 / 用例 / 子代理”。相对于提示词&#xf…

深度测评研究生必用的10款AI论文写作软件

深度测评研究生必用的10款AI论文写作软件 学术写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 在当前科研环境日益激烈的背景下&#xff0c;研究生群体面临论文写作、文献检索、格式规范等多重挑战。随着AI技术的不断进步&#xff0c;各类论文写作软件层出不穷&…

找不到上海智推时代对接方式?这份官方渠道清单收好 - 速递信息

数字化转型的浪潮早已从 “基础建设” 迈入 “深度赋能” 的新阶段,而生成式 AI 的爆发,则让这场转型迎来了最关键的 “生死竞速”—— 谁能率先让品牌与产品融入 AI 的信息生态,谁就能在下一代市场竞争中掌握主动权…

基于 SSH 反向隧道的家庭实验室接入方案

概述 我们经常面临这样的需求:如何在公司或差旅环境中,安全地访问位于家庭内网的AI 训练机? 传统的 DDNS + 路由器端口映射方案暴露面过大,极易招致全网扫描。本文将分享一种 “隐形”架构方案:利用一台公网 VPS(…

华为开源自研AI框架昇思MindSpore应用案例:Pix2Pix实现图像转换

在实际应用场景中&#xff0c;由于训练数据集不足&#xff0c;所以很少有人会从头开始训练整个网络。普遍的做法是&#xff0c;在一个非常大的基础数据集上训练得到一个预训练模型&#xff0c;然后使用该模型来初始化网络的权重参数或作为固定特征提取器应用于特定的任务中。本…

2026年独立站搭建指南:生态功能最全的平台盘点 - 速递信息

都2026年了,还没想好要做哪类独立站?还在平台之间犹豫不决?这一年,我们一定要明确:跨境电商的终点绝不是“网站上线”。一个独立站的上线,只是持续营销的开始。我们盘点出生态功能最全的几大搭建平台,它们都有助…

开源木马“穿上隐身衣”:AsyncRAT新变种借云服务潜入企业内网,EDR成最后防线

在网络安全攻防的灰色地带&#xff0c;一款本为“教学用途”设计的开源工具&#xff0c;正被全球犯罪团伙批量武器化。2026年初&#xff0c;SOC Prime威胁情报团队披露&#xff0c;一种高度混淆、利用合法云平台分发的AsyncRAT&#xff08;Asynchronous Remote Access Trojan&a…

2026年GEO优化推荐:基于多行业应用评价,针对信息过载与成本高昂痛点指南 - 品牌推荐

随着生成式引擎对用户决策路径的深度重塑,GEO已不再是营销领域的“前瞻布局”,而是关乎品牌未来五年增长空间的“生存之战”。数据显示,2025年中国GEO服务市场规模已突破480亿元,且高达84%的头部企业已将GEO纳入年…

2026年行业内优秀的石笼网厂家有哪些,柔韧抗压石笼网/双隔板石笼网/锌铝合金石笼网,石笼网厂商怎么选择 - 品牌推荐师

随着生态治理与基础设施建设的持续推进,石笼网作为河道护坡、边坡防护、景观工程的核心材料,市场需求呈现稳步增长态势。据行业统计,2025年国内石笼网市场规模已突破45亿元,年复合增长率达8.3%,其中华北、华东地区…

springboot高校社团管理系统设计开发实现

高校社团管理系统设计开发背景高校社团作为学生课外活动的重要载体&#xff0c;在培养学生综合素质、丰富校园文化方面发挥着关键作用。传统社团管理多依赖纸质档案、人工统计和线下沟通&#xff0c;存在信息更新滞后、资源分配不均衡、活动组织效率低等问题。随着高校扩招和社…

南京国考面试培训企业哪家好,中政公考口碑和教学质量如何? - 工业品牌热点

随着国考笔试成绩公布,面试环节的竞争逐渐进入白热化,不少考生开始纠结国考面试培训企业该怎么选比较好的国考面试培训机构有哪些核心优势国考面试培训机构排名真的靠谱吗。作为深耕公考培训十六年的专业机构,中政公…

2026年GEO公司推荐:基于技术特性与合规标准的跨平台对比评测 - 品牌推荐

随着生成式人工智能技术全面渗透商业生态,信息分发的权力结构正发生根本性转移。用户日益习惯向AI助手提出自然语言问题,而非键入关键词,这使得生成式引擎优化(GEO)迅速从前沿概念演变为企业获取AI流量、构建品牌…

如何评估geo优化服务商效果?2026年全面评测与推荐,解决效果波动痛点 - 品牌推荐

2025至2026年,生成式AI技术进入规模化应用阶段,AI搜索与智能推荐已成为品牌获取用户注意力的关键渠道。在此背景下,GEO(生成式引擎优化)从一项辅助性工具迅速演变为企业必须投入的核心战略。随着豆包、DeepSeek、…

2026年北京GEO优化公司推荐:基于技术特性与合规标准横向排名,涵盖B2B与专业服务场景 - 品牌推荐

本篇将回答的核心问题 2026年年初,面对生成式AI搜索生态的快速演进,企业应如何构建科学的评估体系,以筛选出真正兼具技术深度、行业理解、效果透明与长期服务价值的GEO优化合作伙伴?市场关注度极高的欧博东方文化传…

FPGA图像处理之直方图均衡化探索

FPGA直方图均衡化/FPGA图像处理 本商品的工程和算法包含以下内容&#xff1a; 1&#xff0c;MATLAB中实现图像处理。 2&#xff0c;verilog代码利用MATLAB联合modelsim仿真实现图像处理。 3&#xff0c;实验对应技术博客讲解。 4&#xff0c;效果展示。 文件包含&#xff1a; 0…