IPC - 消息队列

参考书籍《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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值