消息队列就是由内核负责管理的一个管道,可以按顺序发送消息包(消息类型+消息内容),可以全双工工作,可以不按消息的顺序接收消息。
int msgget(key_t key, int msgflg)
功能:创建/获取消息队列
key:IPC键值,由ftok函数自动生成
msgflg:
0 获取消息队列
IPC_CREAT 创建消息队列
IPC_EXCL 如果存在则创建失败
返回值:消息队列标识
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
功能:向消息队列发送消息
msqid:消息队列标识,msgget函数的返回值
msgp:结构指针
struct msgbuf {
long mtype //消息类型
char mtext[n] //消息内容
}
msgsz:消息的长度,不包括消息类型,sizeof(msgbuf)-4。
msgflg:
0 阻塞,当消息队列满时,等待。
IPC_NOWAIT 不阻塞,当消息队列满时,不等待。
返回值:成功发送返回0,失败返回-1。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "struct.h"
int main()
{
// 创建消息队列
int msgid = msgget(ftok(".",119),IPC_CREAT|0644)
if(0 > msgid)
{
perror("msgget")
return -1
}
Msg msg = {111}
for()
{
printf(">")
gets(msg.data)
msgsnd(msgid,&msg,sizeof(Msg)-sizeof(msg.type),0)
if(0 == strcmp("quit",msg.data))
{
 printf("通信结束!n")
 break
}
}
if(0 > msgctl(msgid,IPC_RMID,NULL))
{
perror("msgctl")
}
}
步骤一、创建消息队列int msgid = msgget(ftok(".",119),IPC_CREAT|0644)
步骤二、发送消息msgsnd(msgid,&msg,sizeof(Msg)-sizeof(msg.type),0)
步骤三、删除消息队列if(0 > msgctl(msgid,IPC_RMID,NULL))