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

IO编程——消息队列

 题目:

 代码实现:

#include <myhead.h>
//正文大小
#define MSGSZ (sizeof(struct msgbuf)-sizeof(long))
//定义要发送的消息类型
struct msgbuf{long msgtype;    //消息类型char mtext[1024];  //消息正文
};int main(int argc, const char *argv[])
{pid_t pid;pid=fork();struct msgbuf buf;if(pid>0){//父进程进行写操作//创建一个key值,方便定位到相应的消息队列中key_t key=ftok("./",'A');if(-1==key){perror("ftok error");return -1;}printf("key=%#x\n",key);//创建消息队列,为了写入数据到队列中int msqid=msgget(key,IPC_CREAT|0664);//IPC_CREAT创建消息队列    IPC_EXCL检测错误   0664队列的权限if(-1==msqid){perror("msgget error");return -1;}printf("msqid=%d\n",msqid);while(1){printf("请输入存放数据的类型(填入类型为long)------->\n");scanf("%ld",&buf.msgtype);getchar();printf("请输入正文的内容------->\n");fgets(buf.mtext,MSGSZ,stdin);buf.mtext[strlen(buf.mtext)-1]=0;//将‘\n’转换成‘0’msgsnd(msqid,&buf,MSGSZ,0);//0表示阻塞printf("写入到信息队列成功!(^<>^)!\n");if(0==strcmp(buf.mtext,"quit")){break;}}}else if(pid==0){//子进程读取队列节点中数据//创建一个key值,方便定位到相应的消息队列中key_t key=ftok("./",'A');if(-1==key){perror("ftok error");return -1;}printf("key=%#x\n",key);//创建消息队列,为了写入数据到队列中int msqid=msgget(key,IPC_CREAT|0664);//IPC_CREAT创建消息队列    IPC_EXCL检测错误   0664队列的权限if(-1==msqid){perror("msgget error");return -1;}printf("msqid=%d\n",msqid);while(1){//从消息队列中读取消息//第一个0表示一直取第一个消息//第二个0表示阻塞方式取出msgrcv(msqid, &buf, MSGSZ, 0, 0);printf("收到消息为:%s\n", buf.mtext);if(strcmp(buf.mtext, "quit") == 0){break;}}}return 0;
}

 注意事项:

        进程中包含读写操作,读取节点时用msgrcv(msqid, &buf, MSGSZ, 0, 0);,那么终端一的读操作和终端二的写操作会发生竟态,故目前有两种解决方案:

        方案一:创建两个消息队B

        方案二:分类获取信息,终端一获取"A"类型节点,终端二获取"B"类节点;

                                               终端一获取"B"类型节点,终端二获取"A"类节点;                   


http://www.mrgr.cn/news/55655.html

相关文章:

  • LED计数电路综合实验
  • Scrapy | 使用Scrapy进行数据建模和请求
  • General Purpose I/O Ports and Peripheral I/O Lines (Ports)
  • 【Linux】【命令】diff
  • WebSocket Secure (WSS)
  • 【C++STL】list的基本介绍与使用方式
  • 【H2O2|全栈】JS入门知识(五)
  • 碰到这个问题请更新或重新安装fastapi版本
  • 时序分解 | Matlab实现EEMD+SE集合经验模态分解+样本熵计算的时间序列信号分解
  • Android 性能之 Game Mode
  • 基于微信小程序的驾校预约系统设计与实现
  • P3924 康娜的线段树
  • 2025医药化工水处理新技术、新工艺、新装备发展论坛3月4日济南举办
  • 【VUE小型网站开发】优化通用配置
  • 【Docker技术详解】(一)Docker镜像文件系统的关系和交互
  • 27.3 一致性哈希算法介绍
  • 142 环形链表II
  • Vim使用与进阶
  • 168K+ Star!AutoGPT:一个构建、部署和运行AI代理的强大平台
  • 【D3.js in Action 3 精译_037】4.1 DIY 实战:D3 源码分析之——d3.timeFormat() 函数
  • 【AI学习】扩散模型学习总结PPT
  • python 爬虫 入门 四、线程,进程,协程
  • Mysql常见面试题总结
  • 深入理解Oracle闪回技术
  • JMeter快速入门示例
  • pycharm中使用ctrl+鼠标滚轮改变字体大小