消息队列

1、类型一样,遵循先进先出。
2、消息队列中的消息是有格式的。
3、消息队列标识符在整个系统中是唯一的,而文件描述符是在一个进程中唯一。
4、#include<sys/types.h>
#include<sys/ipc.h>
key_t ftok(char *path,int id);获得项目相关的唯一的IPC键值。id:项目的ID,只有低8位有效。
5、msgget(key_t key,int msgflg)创建消息队列。
只要使用相同的键值就可以访问同一个消息队列的ID。
msgflg:可以是IPC_CREAT(创建)也可以是IPC_EXCL(如果已经存在则返回失败)。
成功返回标识符。
6、
写入时有一个半固定格式:
typedef struct msg{
 long mtype;
 char text[100];
 ……
}MSG;
第一个参数mtype的格式是固定的,必须是长整型,有且必须有的一个值。而后边的变量都是可变的,不限制个数。存储消息的内容。
7、msgsnd(int id,struct msg,sizeof(struct msg),msgflg);将新消息添加到队列中。
id:队列的ID;struct msg :把这个结构体的内容写到消息队列中。msgflg:为0--调用阻塞,直到条件满足为止。IPC_NOWAIT--消息没有立即发送则调用该函数的进程会立即返回。
成功返回0,失败返回-1;
msgrcv()中的参数和msgsnd()的值类似,只是msgrcv是把队列中的值写到结构体中。其中msgflg还有一个取值是MSG_NOERROR--(暂时略过)
8、msgctl(id,cmd,NULL):队列控制函数;
cmd:IPC_RMID:删除消息队列。

总结:
1、先创建一个消息队列[msgget(key,msgflg)],创建队列前要首先获得一个可用的键值key[ftok(char *path,int id)];
只要使用相同的键值就可以访问同一个消息队列的ID。
2、然后往消息队列中写入并发送[msgsnd(id,struct msg,sizeof(struct msg),msgflg)];
经过1、2两个步骤就可以把要发送的消息写入到消息队列中。以便在其他进程或者程序中读出。

读:
首先得到键值key,然后从消息队列中读取消息[msgrcv(id, struct msg,sizeof(struct msg),msgflag)];消息读到了struct msg结构体中。


 

你可能感兴趣的:(消息队列)