实现即时聊天和聊天的有序退出。在发送聊天消息需要发生自己的本地日历时间。
一、 核心知识点拆解1. 命名管道FIFO的阻塞对齐特性概念命名管道是一种半双工的进程间通信IPC机制在磁盘上有实体文件但内容在内核缓冲区中。特性关键命名管道的open操作默认是阻塞的。当一个进程以只读 (O_RDONLY)方式打开管道时它会死等另一个进程以只写 (O_WRONLY)方式打开同一个管道。必须读写两端都打开open函数才会同时返回。应用在本题中p1和p2互为读写端。两边命令都敲下回车后管道的读写对齐程序才能同时冲破open关卡。2. I/O 多路复用机制select与fd_set为什么需要传统的read会卡死程序。为了同时监听“键盘输入”和“管道来信”必须使用多路复用。fd_set文件描述符集合底层是一个二进制位图Bitmap。每个比特位代表一个文件描述符。1表示监听0表示不监听。核心函数/宏流水线FD_ZERO(rdset);清空清单。FD_SET(fd, rdset);因—— 每次select前把需要监听的通道键盘、管道登记在清单里。select(...)过程—— 把清单交给内核进程睡觉等待。内核会修改清单把没动静的通道抹成0。FD_ISSET(fd, rdset);果——select返回后判断哪个通道活下来了即有数据到了就去处理谁。3. 标准输出的行缓冲机制Line Buffering原理Linux 系统的标准输出终端屏幕默认是行缓冲的。printf的数据不会立刻上屏而是存在内存缓冲区中。刷新条件只有遇到真正的换行符\n、调用fflush、或者程序正常退出时缓冲区才会被冲刷到屏幕上。易错点写成正斜杠/n会被当成普通字符导致数据被“憋”在缓冲区里造成程序“死锁/卡死”的假象。二、 聊天程序运行的底层闭环原理握手阶段阻塞对齐p1打开管道 1 读、管道 2 写p2打开管道 1 写、管道 2 读。双方参数与代码严格互补四端全部对齐后同时冲出open触发各自缓冲区里的printf(success\n)屏幕上同时亮起success。监听阶段多路复用循环进入while(1)双方把自己的键盘0和各自的管道读端fdr打包进rdset交给select托管。通信与时间戳打包一旦敲击键盘select唤醒程序利用time()和ctime()获取当前系统时间通过sprintf()将时间戳与聊天内容在内存中拼接打包成一个完整的字符串最后用write()一次性发送保证了数据的完整性。优雅退出逻辑EOF 传导当 A 端按下Ctrl D其键盘read返回0触发 EOFA 端跳出循环并关闭写端。B 端的管道读端收到通知read返回0B 端得知对方已离开也打印退出整个通信完美释放。代码演示如下p1.c#includefunc.h 2 #includetime.h 3 #define MAXLINE 256 4 5 int main(int argc, char *argv[]){ 6 //命令格式./p1 1.pipe 2.pipe 7 ARGS_CHECK(argc, 3); 8 9 int fdw open(argv[1],O_WRONLY);//打开1管道的写端 10 ERROR_CHECK(fdw, -1, open read); 11 12 int fdr open(argv[2], O_RDONLY);//打开2管道的读端 13 ERROR_CHECK(fdr, -1, open write); 14 15 printf(success\n); 16 17 char buf[4096]; 18 fd_set rdset;// 声明文件描述符可读集合将待执行的文件描述符存入集合 19 while(1){ 20 FD_ZERO(rdset); //重置集合 select会修改rdset每次循环必须清空 21 FD_SET(STDIN_FILENO, rdset); // 将标准输入加入集合监控键盘输入 22 FD_SET(fdr,rdset); //将管道读端加入集合监控管道读端 23 24 select(fdr1, rdset, NULL, NULL,NULL); 25 //只监听可读无写/异常监听无超时设置如果没有没有数据就永久堵塞 26 //接受信息 27 if(FD_ISSET(fdr, rdset)){ 28 memset(buf, 0, sizeof(buf));//清空缓冲区避免旧数据残留 29 ssize_t sret read(fdr, buf, sizeof(buf));//读取数据 30 31 //如果read返回0则管道所有写端关闭 32 if(sret 0){ 33 break; 34 } 35 printf(buf %s\n, buf); 36 } //发送信息 39 if(FD_ISSET(STDIN_FILENO,rdset)){ 40 memset(buf, 0, sizeof(buf)); 41 ssize_t sret read(STDIN_FILENO, buf, sizeof(buf)); 42 43 if(sret 0){ 44 break; 45 } 46 //发送消息时间 47 time_t now time(NULL);//获取时间 48 char *p ctime(now);//转化为日历时间 49 char newbuf[8192] {0}; 50 sprintf(newbuf, %s %s,p,buf);//拼接字符串并存入newbuf数组 51 52 write(fdw, newbuf,strlen(newbuf));//将newbuf写入管道 53 54 55 } 56 } 57 close(fdr); 58 close(fdw); 59 return 0; 60 }p2.c#includefunc.h 2 #includetime.h 3 4 5 int main(int argc, char *argv[]){ 6 ARGS_CHECK(argc, 3); 7 8 int fdr open(argv[1], O_RDONLY); 9 ERROR_CHECK(fdr, -1, open write); 10 11 int fdw open(argv[2], O_WRONLY); 12 ERROR_CHECK(fdw, -1, open read); 13 14 printf(success\n); 15 16 char buf[4096]; 17 fd_set rdset; 18 while(1){ 19 FD_ZERO(rdset); 20 FD_SET(STDIN_FILENO, rdset); 21 FD_SET(fdr, rdset); 22 23 select(fdr1, rdset, NULL, NULL, NULL); 24 //接收信息 25 if(FD_ISSET(fdr, rdset)){ 26 memset(buf, 0,sizeof(buf)); 27 ssize_t sret read(fdr, buf,sizeof(buf)); 28 29 if(sret 0){ 30 break; 31 } 32 printf(buf %s\n,buf); 33 } 34 35 if(FD_ISSET(STDIN_FILENO, rdset)){ 36 memset(buf, 0,sizeof(buf)); 37 ssize_t sert read(STDIN_FILENO, buf, sizeof(buf)); if(sert 0)break; 40 41 //发送时间 42 time_t now time(NULL); 43 char *p ctime(now); 44 char newbuf[8192] {0}; 45 sprintf(newbuf, %s %s,p,buf); 46 write(fdw, newbuf, strlen(newbuf)); 47 48 } 49 } 50 close(fdr); 51 close(fdw); 52 53 54 return 0; 55 }

相关新闻

OpenAI服务健康检查:从连通性到业务可用性的分层检测方案

OpenAI服务健康检查:从连通性到业务可用性的分层检测方案

上周在调试一个基于 OpenAI API 的自动化脚本时,我遇到了一个奇怪的现象:脚本运行得很顺畅,但总感觉少了点什么。直到我打开另一个终端窗口,执行了一个简单的curl命令,才意识到问题所在——我无法快速确认我的服务是否…

2026/9/29 21:13:43 阅读更多 →
人形机器人通信协议深度解析EtherCAT 与 CAN 的对比与最佳实践

人形机器人通信协议深度解析EtherCAT 与 CAN 的对比与最佳实践

本文从协议底层机制到工业级混合架构设计,全面解析人形机器人运动控制通信的核心技术选型与工程实践。 01-核心问题:为什么通信协议选型决定人形机器人的上限? 人形机器人是当今机器人领域最具挑战性的工程系统之一。一台典型的人形机器人拥…

2026/9/24 19:27:51 阅读更多 →
opencode CLI 入口层源码拆解:effectCmd + InstanceStore + bootstrap 三层设计

opencode CLI 入口层源码拆解:effectCmd + InstanceStore + bootstrap 三层设计

拆解 opencode 源码 第二章 CLI 入口与启动流程 总结篇如果你要设计一个 CLI 入口层,你会先做什么? 大部分人从框架选型开始:yargs 还是 commander.js?但 opencode 的第二章揭示了另一个顺序——技术栈选型先于框架选型。因为整…

2026/10/5 4:27:46 阅读更多 →

最新新闻

AI智能体赋能Cypress:自动化前端测试的新范式

AI智能体赋能Cypress:自动化前端测试的新范式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 9:07:48 阅读更多 →
Xenomai双内核架构解析:嵌入式硬实时控制的确定性实现

Xenomai双内核架构解析:嵌入式硬实时控制的确定性实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 9:07:48 阅读更多 →
深度学习识别癌细胞:DNN与CNN图像分类实验对比与PyTorch复现

深度学习识别癌细胞:DNN与CNN图像分类实验对比与PyTorch复现

简介:基于深度学习的癌细胞图像识别技术文献适合人工智能、医学图像处理方向的学生与研究者参考。内容将技术综述与实验分析结合,围绕深度神经网络和卷积神经网络在癌细胞分类中的应用展开,详细介绍了反向传播算法、激活函数、损失函数、网络…

2026/10/5 9:07:48 阅读更多 →
流匹配如何成为生成式AI的通用数学接口

流匹配如何成为生成式AI的通用数学接口

1. 这不是论文列表,而是一份“机器学习前沿动态解码指南” 你点开这个标题——[arxiv-cs.LG] 汇总-2026.09.29-机器学习论文p1——第一反应可能是:又一份枯燥的arXiv每日推送?别急着划走。我连续三年每天凌晨三点定时刷cs.LG分类,…

2026/10/5 9:07:48 阅读更多 →
XXL-AI平台实战:从Agent编排到MCP、SKILL、RAG的生产级AI应用开发

XXL-AI平台实战:从Agent编排到MCP、SKILL、RAG的生产级AI应用开发

做了这么多年后端和应用层开发,2024年下半年开始我明显感觉到一件事:AI应用的复杂度已经从“调通一个模型”转移到了“编排一大堆模型和工具”。以前写个AI功能,无非是调一次大模型API,把结果拼进业务逻辑;现在不一样了…

2026/10/5 9:07:48 阅读更多 →
开源模型替代Jev:从选型到数据系统构建的完整指南

开源模型替代Jev:从选型到数据系统构建的完整指南

最近有个叫 Jev 的模型在圈子里挺火的,看到不少人讨论它,什么“斯坦福教授用 Jev 构建数据系统”“Jev 本地部署”“Jev Windows 部署”这些词一个接一个冒出来。我也顺手去试了一下,确实在对话体验和数据系统构建上有两把刷子,但…

2026/10/5 9:06:48 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →