您的位置:首页 > 其它

进程间通信学习笔记四(消息队列)

2013-02-16 21:40 316 查看
消息队列

信号能够传送的信息量有限

管道只能传送无格式的字节流

消息队列就是一个消息链表,消息可以看作是一个记录,具有特定的格式

消息队列的分类:

posix(可移植的操作系统接口)消息队列

系统v消息队列:是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除

键值

每个消息队列都在系统范围内对应唯一的键值,也是获得消息队列描述字的方法

返回文件名对应的键值

#include <sys/types.h>

#include <sys/ipc.h>

key_t ftok(char *pathname,char proj)

pathname:文件名

proj:项目名(不为0即可)

打开、创建

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int msgget(key_t key,int msgflg)

key:键值,由ftok获得(设为ipc_private时会创建一个新的消息队列)

msgflg:标志位

标志位常用取值:

IPC_CREATE 创建新的消息队列

IPC_EXCL 与create一同使用,如果要创建的消息队列已经存在,返回错误

IPC_NOWAIT 读写消息队列要求无法得到满足时,不阻塞

返回值:与健值key相对应的消息队列描述字

示例代码如下:

int open_queue(key_t keyval){

int qid;

if((qid=msgget(keyval,IPC_CREAT))==-1){

return (-1);

}

return (qid);

}

发送消息

#include <sys/types.h>

#incldue <sys/ipc.h>

#incldue <sys/msg.h>

int msgsnd(int msqid,sturct msgbuf *msgp,int msgsz,int msgflg)

msqid:消息对列的id

msgp: 存放消息的结构

msgsz:消息数据长度

msgflg:发送标志,IPC_NOWAIT指明在消息队列没有足够空间容纳要发送的消息时,

msgsnd是否等待

消息格式:

struct msgbuf{

int mtype;/*消息类型>0*/

char mtext[1];/*消息数据的首地址*/

};

接收消息

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int msgrcv(int msqid,struct msgbuf *msgp,int msgsz,long msgtyp,int msgflg)

从消息队列中读取一个msgtyp类型的消息,并把消息存储在msgp指向的msgbuf结

构中,成功读取后,队列中的这条消息将被删除

示例代码如下:

int read_message(int qid,long type,struct mymsgbuf *qbuf){

int result,length;

/*去掉type类型的长度*/

length=sizeof(struct mymsgbuf)-sizeof(long);

if((result=msgrcv(qid,qbuf,length,type,0))==-1){

return (-1);

}

return (result);

}

示列代码如下:

#include <sys/types.h>

#include <sys/msg.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct msg_buf{

int mtype;

char data[255];

};

int main(){

key_t key;

int msgid;

int ret;

struct msg_buf msgbuf;

/*消息的创建*/

key=ftok("/home/retacn/tmp/app/2",'a');

printf("key=[%x]\n",key);

/*打开消息队列*/

msgid=msgget(key,IPC_CREAT|0666);/*通过文件对应*/

if(msgid==-1){

printf("create error\n");

return -1;

}

/*消息的发送*/

msgbuf.mtype=getpid();

strcpy(msgbuf.data,"test ha");

ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);

if(ret==-1){

printf("send message err\n");

return -1;

}

/*消息的接收*/

memset(&msgbuf,0,sizeof(msgbuf));

ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT);

if(ret==-1){

printf("recv message err\n");

return -1;

}

printf("recv msg=[%s]\n",msgbuf.data);

}

执行结果如下:

[root@localhost app]# gcc msg.c -o msg

[root@localhost app]# ./msg

key=[6105a185]

recv msg=[test ha]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: