Linux下进程通讯消息队列
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 <msqid>
[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 <msqid>
[wbyq@wbyq ~]$ ipcrm -q 4
[wbyq@wbyq ~]$ ipcs -q
--------- 消息队列 -----------
键 msqid 拥有者 权限 已用字节数 消息
0xb8104ad9 1 wbyq 644 0 0
0xd2350093 2 wbyq 666 208 2
2.相关函数
3.示例
(1)创建消息队列,添加消息到队列
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
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 <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
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)运行效果