消息队列的特性:
1)消息队列是一个消息链表,用户可以在消息队列中添加消息、读消息
2)调用的进程必须拥有足够的权限才能对消息队列进行读、写操作
3)消息队列可以按照类型来发现或者接收消息
4)消息队列是IPC对象的一种。消息队列中可以通过唯一的ID来标识
(IPC对象是活动在内核级别的一种,是进程间通信的工具)
接收端代码:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MSG_SIZE 1024
struct msgbuffer
{
long m_type; /* message type, must be > 0 */
char m_text[MSG_SIZE]; /* message data */
};
int main()
{
struct msgbuffer msgb;
key_t key=ftok(".",0);
msgb.m_type=1;
int msgID=msgget(key,IPC_CREAT|0666);
//接收消息
msgrcv(msgID,(void*)&msgb,MSG_SIZE,msgb.m_type,0);
printf("m_text=%s m_type=%ld\n",msgb.m_text,msgb.m_type);
//删除消息队列
if(msgctl(msgID,IPC_RMID,NULL)<0)
{
fprintf(stderr,"msgid %d error\n",msgID);
exit(0);
}
return 0;
}
发送端代码:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdio.h>
#define MSG_SIZE 1024
//定义一个消息结构体
struct msgbuf
{
long m_type; /* message type, must be > 0 */
char m_text[MSG_SIZE]; /* message data */
};
int main()
{
struct msgbuf msgb;
msgb.m_type = 1;
//因为是测试消息队列,所以把数据量写大点
strcpy(msg.m_text,"hello worldhello world jasodoahjshiushduihwudhbsauihgdasoidasoidjslakdjklasjdoiasjhdoiqwhdiouashjkdhskjdhkajshd1234566549789787932yeiu3hjkashdasudhnsajkdhuiashdkjsahdjkshdkjashdijashdkjashdksajhdoiuasydh978yuoisah97dy3hiudhkjwhdiashdjksahdkjsahdjkashdjkashdkjashdkjsahdjk
\n");
key_t key = ftok(".",0);
int msgid = msgget(key,IPC_CREAT|0666);
//发送消息
if((msgsnd(msgid,(void*)&msgb,sizeof(msgb.m_text),0))==0)
{
printf("msg send success\n");
}
return 0;
}
输出:
ipcs -q : 显示所有的消息队列
ipcs -qt: 显示消息队列的创建时间、发送和接收最后一条消息的时间
ipcs -qp:显示往消息队列中存消息,和从消息队列中取消息的进程ID
ipcs -q -i msgid: 显示该消息队列结构体中的消息信息:
ipcs -ql : 显示消息队列的限制信息: