参考书籍《Unix环境高级编程(第三版)》
消息队列是消息的链表,存储在内核中,由消息队列标识符标识。其读写原则符合队列的先进先出原则。当然,这并不完全是这样的。我们可根据消息队列的每一条消息的标识符去读取指定的消息。发送消息数据的结构体可自定义为如下结构体:
struct mymesg
{
long mtype;//消息标识符
char mtext[512];//消息数据
};
该结构体是可以自定义的哦。注意区分消息标识符和消息队列标识符。常用函数如下(具体可查看man手册):
函数名:
ftok函数
函数原形:
key_t ftok(const char *pathname,intproj_id);
函数功能:
生成ipc通信所需的键值
所属头文件:
#include <sys/types.h>
#include<sys/ipc.h>
返回值:
成功:返回键值
失败:返回-1
参数说明:
const char *pathname:路径名
int proj_id:项目ID号
函数名:
msgget函数
函数原形:
intmsgget(key_t key, int msgflg);
函数功能:
打开一个现有消息队列或者创建一个新队列
所属头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:
成功:返回消息队列的标识号
失败:-1
参数说明:
key:键值
msgflg:附加信息
函数名:
msgsnd函数
函数原形:
intmsgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
函数功能:
将数据(即消息)放到消息队列中,总是放在队列尾端
所属头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:
成功:返回0
失败:返回-1
参数说明:
intmsqid:消息队列的ID
constvoid *msgp:指向msgbuf结构体(参见man手册)
size_tmsgsz:消息数据的大小
intmsgflg:附加信息
函数名:
msgrcv函数
函数原形:
ssize_tmsgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
函数功能:
从消息队列中取消息
所属头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:
成功:返回消息数据部分的长度
失败:返回-1
参数说明:
intmsqid:消息队列的ID
void*msgp:指向msgbuf结构体(参见man手册)
size_tmsgsz:指定读取的消息长度
longmsgtyp:指定消息类型(即该消息结构的标识ID,为一长整数)
msgtyp==0 返回队列中的对队首数据
msgtyp>0 返回队列中指定消息类型的数据
msgtyp<0 返回队列中消息类型值小于等于msgtyp绝对值的消息数据
intmsgflg:附加参数
函数名:
msgctl函数
函数原形:
intmsgctl(int msqid, int cmd, struct msqid_ds *buf);
函数功能:
对消息队列执行多种操作
所属头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:
成功:返回0
失败:返回-1
参数说明:
intmsqid:消息队列的ID
intcmd:对队列执行的命令
structmsqid_ds *buf:指向msgqid_ds结构体的指针
编程实例:
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
#include<errno.h>
struct mymesg
{
long mtype;
char mtext[512];
};
int main(int argc,char **argv)
{
struct mymesg msg;
char str[13]="enjoy linux!";
struct mymesg rcv;
msg.mtype=100;
strcpy(msg.mtext,str);
key_t key=ftok("/home/fzz",1);
int msgid=msgget(key,IPC_CREAT);
if(-1==msgid)
printf("msgqueue creat failed!\n");
int length=sizeof(struct mymesg);
if(-1==msgsnd(msgid,&msg,length,IPC_NOWAIT))
printf("msgsnd() write msg failed,errno=%d[%s]\n",errno,strerror(errno));
ssize_t size=msgrcv(msgid,&rcv,length,0,0);
if(-1==size)
printf("msgrcv() read msg failed,errno=%d[%s]\n",errno,strerror(errno));
printf("read message is %s\n",rcv.mtext);
exit(0);
}
参考文章:http://www.cnblogs.com/lpshou/archive/2013/06/20/3145651.html