您的位置:首页 > 其它

消息队列IPC(inter process communication)小记

2013-04-06 22:46 253 查看
1.获取消息队列

消息队列相关的API都在sys/msg.h库中,要创建消息队列,使用函数msgget();这个函数第一个参数为消息队列ID(此Id是给定主机上唯一的描述符或关键字),第二个参数为识别消息旗标的参数,返回值是一个句柄,和文件描述符相似,指向指定Id的消息队列。

int msgget(key_t key, int msgflg);

key_t值必须是一个非零的值或者是特殊符号IPC_PRIVATE。

msgflg允许用户设置两个不同类型的参数:一个指令和一个访问权限设置选项。权限和文件权限类似。指令有三种:

1)IPC_CREAT

2)IPC_CREAT|IPC_EXCL

3)0:告诉msgget消息队列已存在,获取消息队列描述符

key=ftok("/home/queue",0); //保证消息队列id唯一

msgid=msgget(key,IPC_CREAT|0666);

2.配置消息队列

消息大小默认是16kB,可以采用msgctl()函数调整其大小。eg:

struct msqid_ds buf;

msgid=msgget(xxx,0);

msgctl(msgid,XXX,&buf);

msgctl()函数的第二个参数有三种值可以设置:

1)IPC_STAT:读取消息队列当前默认设置

2)IPC_SET :修改消息队列设置

3)IPC_RMID:移除指定的消息队列

注:msgctl()函数可以获取消息队列信息、设置消息队列信息和移除消息队列

3.向消息队列写入消息

消息通过消息队列发送,消息队列上下文环境对消息只有一个限制,即要发送的消息对象必须在它的开头有一个long类型的变量,用于定义消息的类型。通过msgsnd()函数来向消息队列写消息。

4.从消息队列读取消息

首先通过msgget()函数获取消息队列Id,然后通过msgrcv()函数从消息队列读取消息。

5.移除消息队列

使用msgctl()函数和参数IPC_RMID来移除。

msgid=msgget(xxx,0);

msgctl(msgid,IPC_RMID,NULL);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: