首页 > 技术知识 > 正文

Linux下进程通讯消息队列

 MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已。MQ 是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。

消息队列与 FIFO 很相似,都是一个队列结构,都可以有多个进程往队列里面写信息,多个进程从队列中读取信息。

1.查看消息队列命令

  1.查看消息队列:ipcs -q

复制[wbyq@wbyq ~]$ ipcs -q ——— 消息队列 ———– 键 msqid 拥有者 权限 已用字节数 消息 0xb8104ad9 1 wbyq 644 0 0 0xd2350093 2 wbyq 666 208 2

  2.查看消息队列限制信息:ipcs -lq

复制[wbyq@wbyq ~]$ ipcs -lq ———- 消息限制 ———– 系统最大队列数量 = 32000 最大消息尺寸 (字节) = 8192 默认的队列最大尺寸 (字节) = 16384

  3.查看消息队列详细信息:ipcs -q -i

复制[wbyq@wbyq ~]$ ipcs -q -i 2 消息队列 msqid=2 uid=1000 gid=1000 cuid=1000 cgid=1000 模式=0666 cbytes=208 qbytes=16384 qnum=2 lspid=10177 lrpid=10175 发送时间=Thu Apr 28 11:56:08 2022 接收时间=Thu Apr 28 11:56:08 2022 更改时间=Thu Apr 28 11:49:04 2022

  4.创建消息队列:ipcmk -Q

复制[wbyq@wbyq ~]$ ipcmk -Q 消息队列 id:4 [wbyq@wbyq ~]$ ipcs -q ——— 消息队列 ———– 键 msqid 拥有者 权限 已用字节数 消息 0xb8104ad9 1 wbyq 644 0 0 0xd2350093 2 wbyq 666 208 2 0x05ae2c01 4 wbyq 644 0 0

5.删除信号量:ipcrm -q

复制[wbyq@wbyq ~]$ ipcrm -q 4 [wbyq@wbyq ~]$ ipcs -q ——— 消息队列 ———– 键 msqid 拥有者 权限 已用字节数 消息 0xb8104ad9 1 wbyq 644 0 0 0xd2350093 2 wbyq 666 208 2

2.相关函数

复制#include #include #include int msgget(key_t key, int msgflg); 函数功能:创建消息队列 形参:key 键值,ftok产生      msgflg 标志 IPC_CREAT|0666 返回值:失败返回-1,成功返回msqid int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 函数功能: 将消息添加到队列中 形参:msqid msgget函数返回值    msgp 消息内容数据,一般以结构体类型填充       struct msgbuf {             long mtype; /* 消息类型, 必须 > 0 */             char mtext[1]; /消息数据/             };       注意:struct msgbuf必须自己重写,第一个参数long mtype必须指定,且>0,其他类型自定义    msgsz 消息字节数,大小为:sizeof(struct msgbuf)-sizeof(mtype);    msgflg 0当队列满时阻塞,直到消息写入成功       IPC_NOWAIT 当队列满时不阻塞,立刻返回       IPC_NOERROR 若发送的消息大于 size 字节,则把该消息截断,截断部分将被丢弃,且不通知发送进程。 返回值:成功返回0,失败返回-1; ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg); 函数功能:从队列中取出消息 形参:msqid msgget函数返回值    msgp 存放读取到的消息内容    msgsz 消息字节数,大小为:sizeof(struct msgbuf)-sizeof(mtype);    msgtyp 消息类型:        >0 接收对列中的第 1 个类型等于 msgtyp 的消息        ==0 取出消息队列中的第一条消息        <0 接收其类型小于或等于 msgtyp 绝对值的第 1 个最低类型消息    msgflg 0 当队列空时阻塞,或者消息类型不匹配时阻塞        IPC_NOWAIT 不阻塞,立刻返回        IPC_NOERROR 若发送的消息大于 size 字节,则把该消息截断,截断部分将被丢弃,且不通知发送进程。 返回值:成功返回读取的字节数,失败返回-1; int msgctl(int msqid, int cmd, struct msqid_ds *buf); 函数功能:控制函数 形参:msqid msgget函数返回值    cmd 通常为 IPC_RMID 表示删除消息队列。 当删除消息队列时,则buf填NULL即可;

3.示例

  (1)创建消息队列,添加消息到队列

复制#include #include #include #include #include #include #include struct msgbuf { long mtype;//消息类型,必须>0 int cnt; char buff[100]; }; int main(int argc,char *argv[]) { if(argc!=4) { printf(“格式:./app <消息类型> <消息数据> <消息内容>\n”); return 0; } key_t key=ftok(“msgsnd.c”, 1234);//生成键值 if(key==-1) { printf(“生成键值失败err=%s\n”,strerror(errno)); return 0; } printf(“key=%#x\n”,key); int msqid=msgget(key,IPC_CREAT|0666);//创建消息队列 if(msqid==-1) { printf(“创建消息队列失败err=%s\n”,strerror(errno)); return 0; } printf(“msqid=%d\n”,msqid); struct msgbuf msg; msg.mtype=atoi(argv[1]);//消息类型 msg.cnt=atoi(argv[2]);//消息数据 strcpy(msg.buff,argv[3]);//消息内容 int msg_size=sizeof(msg)-sizeof(long);//消息大小,总大小-消息类型大小 /*添加消息到队列*/ int size=msgsnd(msqid,&msg,msg_size,0); if(size==-1) { printf(“写入消息失败err=%s\n”,strerror(errno)); } else printf(“消息写入成功\n”); return 0; }

  (2)从队列中取消息

复制#include #include #include #include #include #include #include struct msgbuf { long mtype;//消息类型,必须>0 int cnt; char buff[100]; }; int main(int argc,char *argv[]) { if(argc!=2) { printf(“格式:./app <消息类型>\n”); return 0; } key_t key=ftok(“msgsnd.c”, 1234);//生成键值 if(key==-1) { printf(“生成键值失败err=%s\n”,strerror(errno)); return 0; } printf(“key=%#x\n”,key); int msqid=msgget(key,IPC_CREAT|0666);//创建消息队列 if(msqid==-1) { printf(“创建消息队列失败err=%s\n”,strerror(errno)); return 0; } printf(“msqid=%d\n”,msqid); struct msgbuf msg; int msg_size=sizeof(msg)-sizeof(long);//消息大小 long msgtyp=atoi(argv[1]);//要写读取的消息类型 //从消息队列中取数据 ssize_t size=msgrcv(msqid,&msg,msg_size,msgtyp,0); if(size==-1) { printf(“读取消息失败err=%s\n”,strerror(errno)); } else { printf(“————读取消息成功size:%ld—————-\n”,size); printf(“\tmtype=%ld\n”,msg.mtype); printf(“\tcnt=%d\n”,msg.cnt); printf(“\tbuff=%s\n”,msg.buff); } return 0; }

  (3)运行效果

Linux下进程通讯消息队列-linux删除文件命令mv

猜你喜欢