当前位置: 首页 > 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.jsqmd.com/news/894443/

相关文章:

  • 终极指南:如何用DeepCAD实现AI驱动的智能CAD建模革命?
  • everfu/hexo-theme-solitude主题本地搜索功能:基于hexo-generator-search的配置
  • 2026年知名的硬质真空镀膜设备/光学真空镀膜设备/PVD镀膜设备厂家选择推荐 - 行业平台推荐
  • 避坑指南:STM32驱动OV7670带FIFO模块,SPI屏显示图像模糊、帧率低的5个常见问题与解决方法
  • [智能体-93]:CNN如何在N维特征相互独立的向量中重新找回像素局部空间相邻关系,纹理、边缘、轮廓、目标形态等视觉特征?
  • AtomMQTT--使用Rust语音实现的轻量级高性能MQtt服务器
  • 告别静态模板:用AI指令动态生成项目脚手架
  • 数据库性能优化实战:索引与查询调优
  • 2026年口碑好的大连工业采暖/大连智慧供热采暖爆款推荐 - 行业平台推荐
  • 告别手动配置:用MCUXpresso Config Tools为i.MX RT1061快速迁移串口外设(以UART1改UART4为例)
  • Debian 10上编译pciutils-3.5.2踩坑记:解决-fvisibility=hidden导致的链接错误
  • 别再让时钟白跑了!手把手教你用Clock Gating给芯片省电(附VCS/DC实战命令)
  • 别只盯着Error 1:深度解析Linux内核make menuconfig背后的ncurses依赖链与编译环境搭建
  • 2026年热门的大连智慧供热采暖/大连别墅采暖优质选择 - 品牌宣传支持者
  • 2026年靠谱的大连空气能取暖工程/大连公司空气能供暖/大连空气能取暖售后/大连学校空气能供暖工程服务商 - 行业平台推荐
  • 别再只调库了!手把手教你为I.MX6ULL写一个DS18B20的Linux字符设备驱动
  • asc-devkit:从零开始写一个NPU算子的完整流程
  • TPU里的脉动阵列,为啥比GPU的CUDA核更省电?聊聊数据复用与能效比
  • Claude Code如何重塑自由职业开发者工作流:从编码到架构的效能跃迁
  • ntp服务器配置
  • 别再折腾防火墙了!用PowerShell一条命令搞定WSL2服务局域网访问(附端口转发规则详解)
  • Mengzi3模型架构详解:万亿tokens训练如何塑造卓越中文理解能力
  • 告别按键!用STM32CubeMX HAL库把内部Flash当EEPROM用(附结构体存储代码)
  • Windows本地Nginx服务器部署SSL证书(OpenSSL自签名证书)
  • 别再只调曝光了!海康工业相机MVS软件里这些隐藏设置,才是提升图像质量的关键
  • vue2知识点:生命周期(包含:生命周期介绍、生命周期钩子、整体流程图详解)
  • 基于SpringBoot + Vue的古典舞在线交流平台设计与实现
  • OSEK直接网络管理实战:从Alive报文到逻辑环建立,一个ECU的“入网”全流程解析
  • PX4多机仿真避坑指南:为什么你的无人机队形飞着飞着就散了?
  • TradingAgents-CN:如何用多智能体AI系统实现专业级股票分析决策