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

Linux--进程-消息队列

一、

消息队列,是消息的链接表存放在内核中。一个消息队列有一个人标识符(及队列ID)来标识。

1、特点:
①、消息队列是面向记录的,其中的消息具有特定的格式以及待定的优先级
②、消息队列独立与发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
③、消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
2、原型:

#include <sys/msg.h>
//创建或打开消息队列:成功返回队列ID,失败返回-1
int msgget(key_t key,int flag);
//key索引值,flag打开队列的方式
//添加消息:成功返回0,失败返回-1
int msgsnd(int msqid,const void *ptr,size_t size,int flag);
//队列ID,消息,消息大小,标志位。
//读取消息:成功返回消息数据的长度,失败返回-1
int msgrcv(int msqid, void *ptr,size_t size,long type,int flag);
//队列ID,消息,消息大小,类型,标志位。
//控制消息队列:成功返回0,失败返回-1
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
//队列ID,
//消息队列的移除

以下两种情况下:msgget将创建一个新的消息队列:
①、如果没有与键值key相对应的消息队列,并且flag中包含了IPC_CREAT标志位
②、key参数为IPC_PRIVATE。

函数msgrcv在读取消息队列时,type参数有以下几种情况:
①、type == 0,返回队列中的第一个消息
②、type > 0,返回队列中消息类型为type的第一个消息。
③、type < 0,返回队列中消息类型值小于或等于type绝对值的消息,如果有多个则取类型的最小值。

例:
获取,读

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>struct msgbuf{long mtype;char mtext[128];
};int main()
{struct msgbuf readBuf;int msgID = msgget(0x1234,IPC_CREAT|0777);//有队列就获取,没有就创建,| 权限可读可写可执行if(msgID == -1){printf("get que failure\n");}msgrcv(msgID,&readBuf,sizeof(readBuf.mtext),888,0);//接收printf("read from que :%s\n",readBuf.mtext);return 0;
}

发送

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>struct msgbuf{long mtype;char mtext[128];
};int main()
{struct msgbuf sendBuf = {888,"this is message from quen"};int msgID = msgget(0x1234,IPC_CREAT|0777);//有队列就获取,没有就创建,| 权限可读可写可执行if(msgID == -1){printf("get que failure\n");}msgsnd(msgID,&sendBuf,strlen(sendBuf.mtext),0);//发送数据return 0;
}

单运行获取get时会发生阻塞,需要运行发送send才可以继续运行

两个互相通信:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>struct msgbuf{long mtype;char mtext[128];
};int main()
{struct msgbuf sendBuf = {888,"this is message from quen"};struct msgbuf readBuf;int msgID = msgget(0x1234,IPC_CREAT|0777);//有队列就获取,没有就创建,| 权限可读可写可执行if(msgID == -1){printf("get que failure\n");}msgsnd(msgID,&sendBuf,strlen(sendBuf.mtext),0);//发送数据msgrcv(msgID,&readBuf,sizeof(readBuf.mtext),988,0);//接收printf("reaturn from get :%s\n",readBuf.mtext);return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>struct msgbuf{long mtype;char mtext[128];
};int main()
{struct msgbuf readBuf;int msgID = msgget(0x1234,IPC_CREAT|0777);//有队列就获取,没有就创建,| 权限可读可写可执行if(msgID == -1){printf("get que failure\n");}msgrcv(msgID,&readBuf,sizeof(readBuf.mtext),888,0);//接收printf("read from que :%s\n",readBuf.mtext);struct msgbuf sendBuf = {988,"thank you for reach !"};msgsnd(msgID,&sendBuf,strlen(sendBuf.mtext),0);return 0;
}
http://www.lryc.cn/news/166426.html

相关文章:

  • MySQL下载安装环境变量配置,常用命令
  • HSRP(热备份路由选择协议)的概念,原理与配置实验
  • 数据可视化大屏模板 | 保姆级使用教程
  • qml怎么显示网页
  • leetcode分类刷题:二叉树(一、简单的层序遍历)
  • STM32 CAN使用记录:FDCAN基础通讯
  • GB/T 11945-2019 蒸压灰砂实心砖和实心砌块检测
  • echarts静态饼图
  • Linux中的apt与yum
  • DQN算法概述及基于Pytorch的DQN迷宫实战代码
  • Pytorch学习整理笔记(一)
  • paddlespeech asr脚本demo
  • 算法分析与设计编程题 递归与分治策略
  • Java的XWPFTemplate工具类导出word.docx的使用
  • Science adv | 转录因子SPIC连接胚胎干细胞中的细胞代谢与表观调控
  • 机器学习实战-系列教程7:SVM分类实战2线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读
  • DOM渲染与优化 - CSS、JS、DOM解析和渲染阻塞问题
  • 基于小程序的理发店预约系统
  • MD5 算法流程
  • TCP/IP协议详解
  • SSM SpringBoot vue快递柜管理系统
  • 期权交易保证金比例一般是多少?
  • 029:vue项目,勾选后今天不再弹窗提示
  • Unet语义分割-语义分割与实例分割概述-001
  • Linux常用命令字典篇
  • __declspec(novtable) 在C++
  • ChatGPT充值,银行卡被拒绝
  • 算法通过村第七关-树(递归/二叉树遍历)白银笔记|递归实战
  • 抖音小程序开发教学系列(6)- 抖音小程序高级功能
  • SpringBoot运行原理