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

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);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章