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

IO 8

一、思维导图

二、练习

使用消息队列完成两个进程之间相互通信

//A进程

#include<myhead.h> //要发送的消息类型 struct msgbuf { long mtype; char mtext[1024]; }; #define SIZE sizeof(struct msgbuf)-sizeof(long) int main(int argc, const char *argv[]) { //1、创建key,用于创建消息队列 key_t key = ftok("/",'c'); if(key == -1) { perror("ftok error"); return -1; } //2、通过key创建消息队列 int msqid = msgget(key,IPC_CREAT|0664); if(msqid == -1) { perror("msgget error"); return -1; } //创建子进程 pid_t pid = fork(); if(pid == -1) { perror("A fork error"); return -1; } if(pid > 0) { //父进程,向消息队列中存入数据 //3、向消息队列中存入消息 struct msgbuf buf; while(1) { //设置消息类型 buf.mtype = 1; //A向B发送的消息类型 // printf("请输入消息内容:"); fgets(buf.mtext,SIZE,stdin); buf.mtext[strlen(buf.mtext)- 1] = 0; //将换行换成'\0' //将消息存入消息队列中 msgsnd(msqid,&buf,SIZE,0); //判断退出标志 if(strcmp(buf.mtext,"quit") == 0) { //当向对面发送退出标志时,同时向自己的子进程发送退出标志 //设置消息类型 buf.mtype = 2; //A向A发送的消息类型 strcpy(buf.mtext,"quit"); //将消息存入消息队列中 msgsnd(msqid,&buf,SIZE,0); break; } } } else if(pid == 0) { //子进程,从消息队列中取出数据 //3、从消息队列中取出数据 struct msgbuf buf; while(1) { //指定读取消息类型为2,以阻塞的形式读取信息 msgrcv(msqid,&buf,SIZE,2,0); //判断退出标志 if(strcmp(buf.mtext,"quit") == 0) { break; } printf("B:%s\n",buf.mtext); } //退出子进程 exit(EXIT_SUCCESS); } //非阻塞回收子进程资源 waitpid(-1,NULL,WNOHANG); return 0; }

//B进程

#include<myhead.h> //要发送的消息类型 struct msgbuf { long mtype; char mtext[1024]; }; #define SIZE sizeof(struct msgbuf)-sizeof(long) int main(int argc, const char *argv[]) { //1、创建key,用于创建消息队列 key_t key = ftok("/",'c'); if(key == -1) { perror("ftok error"); return -1; } //2、通过key创建消息队列 int msqid = msgget(key,IPC_CREAT|0664); if(msqid == -1) { perror("msgget error"); return -1; } //创建子进程 pid_t pid = fork(); if(pid == -1) { perror("A fork error"); return -1; } if(pid > 0) { //父进程,向消息队列中存入数据 //3、向消息队列中存入消息 struct msgbuf buf; while(1) { //设置消息类型 buf.mtype = 2; //B向A发送的消息类型 // printf("请输入消息内容:"); fgets(buf.mtext,SIZE,stdin); buf.mtext[strlen(buf.mtext)- 1] = 0; //将换行换成'\0' //将消息存入消息队列中 msgsnd(msqid,&buf,SIZE,0); //判断退出标志 if(strcmp(buf.mtext,"quit") == 0) { //当向对面发送退出标志时,同时向自己的子进程发送退出标志 //设置消息类型 buf.mtype = 1; //B向B发送的消息类型 strcpy(buf.mtext,"quit"); //将消息存入消息队列中 msgsnd(msqid,&buf,SIZE,0); break; } } } else if(pid == 0) { //子进程,从消息队列中取出数据 //3、从消息队列中取出数据 struct msgbuf buf; while(1) { //指定读取消息类型为1,以阻塞的形式读取信息 msgrcv(msqid,&buf,SIZE,1,0); //判断退出标志 if(strcmp(buf.mtext,"quit") == 0) { break; } printf("A:%s\n",buf.mtext); } //退出子进程 exit(EXIT_SUCCESS); } //非阻塞回收子进程资源 waitpid(-1,NULL,WNOHANG); return 0; }

http://www.rkmt.cn/news/1399006.html

相关文章:

  • 终极指南:如何用DeepCAD实现AI驱动的智能CAD建模革命?
  • Kettle里的‘隐藏高手’:用JavaScript脚本和WebService查询,轻松处理复杂API数据清洗与入库
  • 终极指南:如何通过TranslucentTB实现Windows多显示器任务栏透明统一配置
  • 保姆级避坑指南:用CCS12.1+TI Clang搞定CC2340开发环境(附Sysconfig配置)
  • 告别手动配置:用MCUXpresso Config Tools为i.MX RT1061快速迁移串口外设(以UART1改UART4为例)
  • 基于实时演算的TSN确定性网络可行性分析与组件化建模实践
  • Debian 10上编译pciutils-3.5.2踩坑记:解决-fvisibility=hidden导致的链接错误
  • 别再让时钟白跑了!手把手教你用Clock Gating给芯片省电(附VCS/DC实战命令)
  • 2026年热门的大连智慧供热采暖/大连别墅采暖优质选择 - 品牌宣传支持者
  • 信息性缺失:从填补到利用,构建可解释分类框架
  • ntp服务器配置
  • 深入Linux内核:图解Ramdisk从压缩包到根文件系统的完整解压与挂载流程
  • 别再让CUDA多线程打架了!手把手教你用atomicCAS实现一个简单的自旋锁(附完整代码)
  • 从7系列FPGA选型说起:如何看懂Xilinx芯片型号里的LC、LUT和FF数量?
  • 用Multisim复刻一个0-24V/0-2.6A可调电源:从TL431基准到IGBT驱动的保姆级仿真教程
  • TradingAgents-CN:如何用多智能体AI系统实现专业级股票分析决策
  • PX4多机仿真避坑指南:为什么你的无人机队形飞着飞着就散了?
  • 别再只把MD5当校验工具了!从BUUCTF题目看它在CTF中的‘脆弱’与妙用
  • 关于如何设置电脑通电自动重启以及自动连接校园网
  • MySQL 登录插件 auth_socket 详解:为什么Ubuntu装完MySQL不用密码就能进?
  • 别再乱选Unity灯光模式了!Baked、Mixed、Subtractive保姆级选择指南(附实战对比图)
  • Yuzu模拟器完整配置指南:从安装到流畅运行Switch游戏
  • Lovable健身后台架构演进史:从单体到Service Mesh,支撑日均500万次AI动作识别的4次重构纪要
  • vben中通过自定义指令 实现边界拖拽
  • 终极围棋AI训练指南:3步快速提升棋力的免费解决方案 [特殊字符]
  • RankMixer:抖音工业级推荐系统的异构特征交互与并行化架构
  • Mengzi3模型架构详解:万亿tokens训练如何塑造卓越中文理解能力
  • 无曝气PTFE-MBR+RO回用技术哪家好?2026优质合作厂商推荐 - 栗子测评
  • 告别SDIO和USB!在i.MX8平台上为你的IoT设备选型与部署PCIe WIFI模块(以88W8997为例)
  • 别再只会用php://filter了!深入理解PHP文件包含的三种利用姿势:伪协议、远程包含与日志注入