linux进程间通信------命名管道
1.命名管道命名管道FIFO是一种通过文件路径标识的特殊文件能够为不相关进程提供流式通信能力任意进程只需要通过统一路径打开该文件即可实现跨进程数据交换其内核缓冲区独立于创建者生命周期存在但本质仍是无消息边界的单向字节流通道。1.1创建命名管道命名管道可以从命令上创建mkfifo filename从程序上创建//int mkfifo(const char* filename,mode_t mode); int main() { mkfifo(h1,0644); return 0; }mode_t mode是文件掩码用于指定管道权限规则同open/chmod实际权限mode~umask能够支持标准宏或自定义八进制值常用权限0644所有者读写其余只读0600仅所有者读写0666读写权限最终0666~umask注意mode只控制新建管道的访问权限不含执行权限mkfifo函数成功返回0失败返回-1同时设置errno1.2匿名管道与命名管道的区别匿名管道由pipe函数创建并打开命名管道由mkfifo创建用open打开FIFO命名管道与pipe匿名管道之间的唯一区别在于它们创建与打开的方式不同一旦这些工作完成后就具有相同的语义了且它们都是单向通道1.3命名管道的打开方式当前打开操作为读而打开FIFO时O_NONBLOCK disable阻塞直到有进程为写而打开FIFOO_NONBLOCK enable立即返回成功当前打开操作为写而打开FIFO时O_NONBLOCK disable阻塞直到有进程为读而打开FIFOO_NONBLOCK enable立即返回失败错误码为ENXIO2.用命名管道实现文件拷贝linux内核中规定FIFO管道必须有读和写两端同时打开才能正常通信通过两个进程分别运行不同的程序实现使用命名管道进行文件拷贝进程A进行创建命名管道tp并以只读的模式打开在当前目录下的普通文件abc作为进行拷贝的源文件。以只写模式打开刚创建的tp管道后会被阻塞挂起等待另一个进程B以只读模式打开同一个tp管道随后将源文件的数据写入tp中。#includecstdio #includefcntl.h #includesys/stat.h #includesys/types.h #includecstdlib #includecerrno #includeunistd.h #define ERR_EXIT(m)\ do\ {\ perror(m);\ exit(EXIT_FAILURE);\ }while(0) int main(int argc,char* argv[]) { if(mkfifo(tp,0644)-1errno!EEXIST) ERR_EXIT(mkfifo); int infd; infdopen(abc,O_RDONLY); if(infd-1) ERR_EXIT(open); int outfd; outfdopen(tp,O_WRONLY); if(outfd-1) ERR_EXIT(open); char buf[1024]; ssize_t n; while((nread(infd,buf,1024))0) { write(outfd,buf,n); } close(infd); close(outfd); return 0; }进程B以只写的形式打开当前目录下普通文件abc.bakO_CREAT|O_TRUNC指的是文件若不存在则创建若已存在则清空文件内容。以只读的形式打开已存在的管道tp此时写端进程A的阻塞会被解除两端开始进行连接随后循环不断读取tp管道内的内容写入文件abc.bak直到管道数据读取完毕也就是收到EOF时关闭文件描述符调用unlink删除管道文件tp清理资源#includecstdio #includefcntl.h #includesys/stat.h #includesys/types.h #includecstdlib #includecerrno #includeunistd.h #define ERR_EXIT(m)\ do\ {\ perror(m);\ exit(EXIT_FAILURE);\ }while(0) int main(int argc,char* argv[]) { int outfd; outfdopen(abc.bak,O_WRONLY|O_CREAT|O_TRUNC,0644); if(outfd-1) ERR_EXIT(open); int infd; infdopen(tp,O_RDONLY); if(infd-1) ERR_EXIT(open); char buf[1024]; ssize_t n; while((nread(infd,buf,1024))0) { write(outfd,buf,n); } close(infd); close(outfd); unlink(tp); return 0; }3.使用命名管道实现客户端与服务器端通信这是一个基于命名管道FIFO单向通信服务端其设计为单客户端模式单次运行仅负责接收一个客户端所发的消息并且引入了信号处理机制通过捕捉信号SIGINT信号也就是ctrlc可以确保用户强行中断进程时能够自动清理残留的管道文件tp客户端#includeiostream #includecstring #includefcntl.h #includecerrno #includeunistd.h using namespace std; #define ERR_EXIT(m)\ do\ {\ perror(m);\ exit(EXIT_FAILURE);\ }while(0); int main() { int wfdopen(tp,O_WRONLY); if(wfd-1) ERR_EXIT(open); char buf[1025]; coutplease wait...endl; while(1) { fflush(stdout); ssize_t nread(0,buf,sizeof(buf));//read会从buf[0]开始写 if(n0) { buf[n]0; ssize_t swrite(wfd,buf,n); if(s0) ERR_EXIT(write); } else if(n0) { break; } else { ERR_EXIT(read); } } if(close(wfd)-1) ERR_EXIT(close); return 0; }服务器端#includeiostream #includecstring #includefcntl.h #includecerrno #includeunistd.h #includesignal.h #includesys/types.h #includesys/stat.h using namespace std; #define ERR_EXIT(m)\ do\ {\ perror(m);\ exit(EXIT_FAILURE);\ }while(0); const char* file_nametp; void clean_and_exit(int sig) { unlink(file_name); _exit(0); } int main() { umask(0); unlink(file_name);//删除同名文件 if(mkfifo(file_name,0644)-1) ERR_EXIT(mkfifo); //注册信号处理函数处理使用ctrlc发送结束进行的信号 signal(SIGINT,clean_and_exit); int rfdopen(file_name,O_RDONLY); if(rfd0) ERR_EXIT(open); char buf[1024]; coutplease wait...endl; while(1) { ssize_t nread(rfd,buf,sizeof(buf)); if(n0) { coutclient says# ; cout.write(buf,n);//按精度长度输出避免越界 } else if(n0) { coutclient disconnectedendl; break; } else { if(errnoEINTR) continue; ERR_EXIT(read); } } close(rfd); unlink(file_name); return 0; }

相关新闻

Python自动化检测验证码逻辑漏洞:从原理到实战工具开发

Python自动化检测验证码逻辑漏洞:从原理到实战工具开发

1. 项目概述:从“验证码”到“逻辑漏洞”的攻防视角在Web安全测试的实战中,验证码(CAPTCHA)一直是一个绕不开的话题。它设计的初衷是区分人类用户和自动化脚本,是抵御暴力破解、垃圾注册、恶意刷票等攻击的第一道防线。…

2026/7/5 14:02:31阅读更多 →
YouTube AI 助手存在提示注入风险,点击链接或致创作者私人视频标题泄露!

YouTube AI 助手存在提示注入风险,点击链接或致创作者私人视频标题泄露!

[javoriuski] [GitHub](https://github.com/javoriuski) [HackerOne](https://hackerone.com/javxfps) [X](https://x.com/javoriuski) 事件背景 YouTube Studio 有个叫 Ask Studio 的 AI 助手。打开它,询问“我的观众在说什么?”这类问题,它…

2026/7/5 13:57:31阅读更多 →
Java程序设计(第3版)第四章——静态代码块

Java程序设计(第3版)第四章——静态代码块

#静态代码块 1.static可以用于修饰初始化代码块 2.初始化代码块(动态代码块) 3.位置:定义在类以内,方法以外的{} 4.作用:创建对象时,按照和属性定义的先后顺序完成属性的初始化工作 5.静态代码块:被static修饰符的初始化代码块称为…

2026/7/5 13:57:31阅读更多 →
F3闪存检测工具:3步识别扩容盘,保护你的数据安全

F3闪存检测工具:3步识别扩容盘,保护你的数据安全

F3闪存检测工具:3步识别扩容盘,保护你的数据安全 【免费下载链接】f3 F3 - Fight Flash Fraud 项目地址: https://gitcode.com/gh_mirrors/f3/f3 F3(Fight Flash Fraud)是一款专业的开源闪存检测工具,专门用于识…

2026/7/5 14:57:36阅读更多 →
11. 【C语言】表格与矩阵:多维数组

11. 【C语言】表格与矩阵:多维数组

上一篇文章我们学会了一维数组——它像一排连续的抽屉,整齐地排成一条直线。但现实中的数据往往比“一排”更复杂:课程表有行有列,棋盘有纵横坐标,图像是由像素组成的矩形网格。这时候,一维数组就有些力不从心了。 好…

2026/7/5 14:57:36阅读更多 →
10. 【C语言】把数据排成队:一维数组

10. 【C语言】把数据排成队:一维数组

上一篇我们学会了循环,程序终于可以不知疲倦地重复干活了。但这时候一个尴尬的问题浮出水面:如果我要存储一个班 50 个学生的成绩,难道要定义 score1, score2, score3 ... score50 一共 50 个变量吗? 真要这样写,别说…

2026/7/5 14:57:36阅读更多 →
9. 【C语言】重复是力量:C语言循环结构

9. 【C语言】重复是力量:C语言循环结构

前几篇文章,我们让程序有了记忆(变量),会说话(输入输出),还学会了判断(分支)。但程序还有一个让人类望尘莫及的本事:不知疲倦地重复做一件事。 想想看&#…

2026/7/5 14:57:36阅读更多 →
4-20mA电流环检测与PIC单片机信号处理方案

4-20mA电流环检测与PIC单片机信号处理方案

1. 4-20mA电流环基础与行业应用工业现场最可靠的信号传输方式莫过于4-20mA电流环,这个看似简单的标准已经统治过程控制领域半个多世纪。电流信号相比电压信号具有显著优势:抗干扰能力强,可长距离传输(理论可达数公里)&…

2026/7/5 14:57:36阅读更多 →
PyTorch 2.0+ 实战:Fashion MNIST 图像分类从 91% 到 95% 的 3 个调优技巧

PyTorch 2.0+ 实战:Fashion MNIST 图像分类从 91% 到 95% 的 3 个调优技巧

PyTorch 2.0 实战:Fashion MNIST 图像分类从 91% 到 95% 的 3 个调优技巧当你在Fashion MNIST数据集上训练一个基础CNN模型时,91%的准确率可能看起来已经不错了。但对于追求极致性能的开发者来说,这仅仅是起点。本文将分享三个经过实战验证的…

2026/7/5 14:52:35阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/5 3:48:10阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/5 3:48:09阅读更多 →