消息队列简记 傷城~ 2022-05-16 08:10 186阅读 0赞 **消息队列简记** 在了解了[信号量][Link 1] 和[共享内存][Link 2] 之后, 消息队列自然就比较容易理解了. 之前提到共享内存的操作不是原子的, 那么便可以结合信号量来进行控制. 消息队列是另外一种进程间通信的手段, 使用以下几个函数调用. *\#include <sys/types.h>* *\#include <sys/ipc.h>* *\#include <sys/msg.h>//一般上述两个头文件都被此文件包含* *int msgget(key\_t key, int msgflg);* *int msgsnd(int msqid, const void \*msgp, size\_t msgsz, int msgflg);* *ssize\_t msgrcv(int msqid, void \*msgp, size\_t msgsz, long msgtyp, int msgflg);* *int msgctl(int msqid, int cmd, struct msqid\_ds \*buf);* 由此可见几种IPC機制都是类似的. *msgget(key, msgflg);* 同样的道理, 该函数创建或获取一个和key相关的消息队列, 一般使用 0666 | IPC\_CREAT作为msgflg的值. 看到0666很容易想到777(关于chmod), 很容易可以知道是设置权限. 操作的是低9位, 666就是110110110, 从高到低对应着u(用戶), g(组别), o(其他)的读,写和执行权限. 比如最高三位110表示u有读和写权限, 但没有执行权限. 函数返回一个msgid, 供其它相关函数使用. *msgsnd(msgid, msgp, msgsz, msgflg);* 一般来说, 消息队列中的消息成员都是一个结构体, 该结构体至少包含两个成员: 一个是消息类型,另一个是消息数据. 比如: \#define MSGSIZ 1024 struct msg\_st \{ long msg\_type; char msg\_text\[MSGSIZ\]; \}; 而msgp就是指向要传送的消息的指针. msgsz是消息的大小, 不包含消息类型. msgflg一般置0. *msgrcv(msgid, msgp, msgsz, msgtyp, msgflg);* 与msgsnd类似, 不同的是第4个参数msgtyp. msgtyp指定了要接收的消息类型, 一共有3种情况. 1. msgtyp为0, 表示按顺序接收消息队列中的成员. 2. msgtyp为某正数, 表示接收类型为该正数的消息, 类型由消息结构体中的msg\_type指定. 3. msgtyp为某负数, 表示接收类型小于等于该负数绝对值的类型消息. msgctl一般用来撤销消息队列, 形如 msgctl(msgid, IPC\_RMID, 0). 下面是个小实验: 用于发送消息的msg1.c: \#include <stdlib.h> \#include <stdio.h> \#include <string.h> \#include <unistd.h> \#include <sys/msg.h> \#include "msg\_st.h" int main()\{ int i; int msg\_id; char buf\[MSGSIZ\]; struct msg\_st msg\_ptr; msg\_id = msgget((key\_t)1234, 0666 |IPC\_CREAT); for(i=0; i<3; i++)\{ printf("请輸入第%d条要发送的消息:", i); scanf("%s", buf); msg\_ptr.msg\_type = i; strcpy(msg\_ptr.msg\_text, buf); msgsnd(msg\_id, (void \*)&msg\_ptr, 512, 0); \} printf("已发送完消息./n"); return 0; \} 用于接收消息的msg2.c(指定接收数据类型为1的消息): \#include <stdlib.h> \#include <stdio.h> \#include <unistd.h> \#include <sys/msg.h> \#include "msg\_st.h" int main(int argc, char \*argv\[\])\{ int msg\_id; struct msg\_st msg\_ptr; msg\_ptr.msg\_type = 1; msg\_id = msgget((key\_t)1234, 0666 | IPC\_CREAT); printf("要接收的消息类型为%ld/n", msg\_ptr.msg\_type); msgrcv(msg\_id, (void \*)&msg\_ptr, 512, msg\_ptr.msg\_type, 0); printf("接收到的消息为:%s/n", msg\_ptr.msg\_text); msgctl(msg\_id, IPC\_RMID, 0); return 0; \} Jason Lee 2009-11-16 p.m P.S. 一家之言,如有不足,请多加指正。 [Link 1]: http://blog.csdn.net/jasonblog/archive/2009/11/14/4811156.aspx [Link 2]: http://blog.csdn.net/jasonblog/archive/2009/11/15/4814126.aspx
相关 消息队列 一、消息队列MQ(Message Queue): 1)消息队列是一种先进先出的数据结构; 2)消息队列使用的“协议”不是具体的通讯协议,而是更高层次通讯模型。它定义 「爱情、让人受尽委屈。」/ 2023年10月11日 11:11/ 0 赞/ 57 阅读
相关 消息队列? 对于 MQ 来说,其实不管是 RocketMQ、Kafka 还是其他消息队列,它们的本质都是:一发一存一消费。下面我们以这个本质作为根,一起由浅入深地聊聊 MQ。 01 从 Bertha 。/ 2023年10月10日 12:49/ 0 赞/ 35 阅读
相关 消息队列 一、什么是消息队列 以下为虚构的小故事: 有一天,产品跑来跟小王说:“我们要做一个用户实名的功能,需要在用户实名成功后给用户发一条短信。” 小王(攻城狮leve 缺乏、安全感/ 2023年10月06日 17:00/ 0 赞/ 59 阅读
相关 消息队列 1. 消息队列在项目中的使用 背景:在分布式系统中是如何处理高并发的。 由于在高并发的环境下,来不及同步处理用户发送的请求,则会导致请求发生阻塞。比如说,大量的ins ﹏ヽ暗。殇╰゛Y/ 2022年12月15日 03:23/ 0 赞/ 278 阅读
相关 消息队列 https://www.cnblogs.com/457248499-qq-com/p/7392678.html 来源 消息队列:在消息的传输过程中保存消息的容器。 迈不过友情╰/ 2022年05月30日 07:42/ 0 赞/ 294 阅读
相关 消息队列简记 消息队列简记 在了解了[信号量][Link 1] 和[共享内存][Link 2] 之后, 消息队列自然就比较容易理解了. 之前提到共享内存的操作不是原子的, 那么 傷城~/ 2022年05月16日 08:10/ 0 赞/ 187 阅读
相关 消息队列 消息队列是啥?我觉得大家都心知肚明,已经众所周知到不用解释的程度。不过,但凡学习、解释一样东西,都应该遵循 “它是什么?”、 “做什么用?”、 “为啥要用它” ╰半橙微兮°/ 2022年04月23日 08:42/ 0 赞/ 364 阅读
相关 消息队列 消息队列介绍 维基百科上的描述:在计算机科学中,消息队列(Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通 红太狼/ 2022年01月26日 10:51/ 0 赞/ 356 阅读
相关 消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 1. 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑。再不然就 小咪咪/ 2021年12月20日 06:51/ 0 赞/ 447 阅读
还没有评论,来说两句吧...