Chinaunix首页 | 论坛 | 博客
  • 博客访问: 458764
  • 博文数量: 113
  • 博客积分: 446
  • 博客等级: 下士
  • 技术积分: 1229
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-09 16:01
个人简介

Let's go!!!!!

文章分类

全部博文(113)

文章存档

2019年(5)

2018年(4)

2017年(9)

2016年(5)

2015年(39)

2014年(6)

2013年(28)

2012年(17)

分类: LINUX

2012-12-09 20:27:41

消息队列
消息队列是消息的链接表,存放在内核中并有消息队列标识符标识。
int msgget(key_t key,int flag) 用于创建一个新队列或打开一个现存的队列。
int msgsend(int msqid,void *ptr,size_t bytes,int flag)将新消息增加到队列尾端。每个消息包含一个正长整型类型字段,一个非负长度以及实际数据字节,所有这些都在将消息增加到
队列时,传送给msgsend。
msqid为消息队列id,ptr为指向要发送的消息地址的指针,消息的结构可定义为
struct msg
{
int type;
char buf[20];
};
bytes为发送消息有字节数,flag为发送标识,可以为IPC_NOWAIT。IPC_NOWAIT的作用,若消息队列已满,IPC_NOWAIT使得msgsend立即出错返回。若不指定IPC_NOWATI标识,进程阻塞到出现
下述情况之一出现位置:1.有空间容纳消息了 2.系统删除队列 3.捕捉到一个信号,并从处理程序返回。
ssize_t msg_rcv(int msqid,void *ptr,size_t bytes,long type,int flag)用于从队列中取消息。
对msg_rcv()中的参数理解参看msg_send()中的参数。
int msgctl(int msqid,int cmd,struct msqid_ds *buf)此函数类似于ioctl函数。(垃圾桶函数)
cmd有一下三中值:
IPC_STAT:取队列的struct_ds结构,放在buf所指的结构中
IPC_SET:与IPC_STAT相反
IPC_RMID:从系统中删除该消息队列以及仍在队列中的消息
struct msqid_ds{
struct ipc_perm msg_perm;
msgqnum_t msg_qnum;
......
};
注意:我们并不一定要以先进先出的次序取消息,也可以按消息的类型字段取消息。
//msg_send.c
#include
#include
#include
#include
#include
#include
#include
struct msg_buf
{
int type;
char data[255];
};
int main()
{
key_t key;
int msgid;
int ret;
struct msg_buf msgbuf;
key=ftok("/etc/passwd",255);
printf("key=%d\n",key);
msgid=msgget(key,IPC_CREAT|0666);
if(msgid==-1)
{
perror("create error");
exit(1);
}
msgbuf.type=1;
strcpy(msgbuf.data,"test ha");
ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
msgbuf.type=2;
strcpy(msgbuf.data,"test hello");
ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
msgbuf.type=3;
strcpy(msgbuf.data,"test hi");
ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
return 0;
}

//msg_reciece.c
#include
#include
#include
#include
#include
#include
#include
struct msg_buf
{
int type;
char data[255];
};
int main()
{
key_t key;
int msgid;
int ret;
struct msg_buf msgbuf;
key=ftok("/etc/passwd",255);
msgid=msgget(key,0666);
if(msgid==-1)
{
perror("create error");
exit(1);
}
memset(&msgbuf,0,sizeof(msgbuf));
ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),3,IPC_NOWAIT);
printf("recieve msg=%s\n",msgbuf.data);
ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),2,IPC_NOWAIT);
printf("recieve msg=%s\n",msgbuf.data);
ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),1,IPC_NOWAIT);
printf("recieve msg=%s\n",msgbuf.data);
msgctl(msgid,IPC_RMID,0);
return 0;
}
阅读(2775) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~