消息队列
消息队列是一个存放在内核中的消息链表.每个消息队列由消息队列标识符标识.因为存放在内核中,所以只有在内核重启或显式删除一个消息队列时,该消息队列才会被真正删除.
重要的几个数f结构
2.msqid_ds内核数据结构
3.ipc_perm内核数据结构
消息队列的创建
每个消息队列在系统范围内对应唯一的键值.要获得一个消息队列的描述符,只要提供该消息队列的键值即可,该键值通常由函数ftok返回.
ftok函数
该函数定义在头文件sys/ipc.h中.
ftok函数根据pathname和proj_id这两个参数生成唯一的键值.函数执行成功返回一个键值,失败返回-1.
/*获取键值ftok.c*/
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<stdlib.h>
int main(void)
{
int i;
for(i = 1; i <= 5; i++)
printf("key[%d] = %ul ]\n", i, ftok(".", i));
exit(0);
}
运行结果:
参数pathname在系统中一定要存在且进程有权访问,参数proj_id的取值范围为1~255.
msgget函数
Ftok()返回的键值可以提供给函数msgget.Msgget()根据这个键值创建一个新的消息队列,或者访问一个已存在的消息队列.
msgget定义在头文件sys/msg.h中:
int msgget (key_t key, int msgflg)
参数key为ftok函数的返回值.
msgflg是一个标志参数.可能取值:
1.IPC_CREATE: 如果内核中不存在与key相等的消息队列,则新建一个消息队列.如果存在这样的消息队列,返回该消息队列的描述符
2.IPC_EXCL: 和IPC_CREATE一起使用,如果对应键值的消息队列已经存在,则出错,返回-1.
该函数调用成功返回一个消息队列的描述符,失败返回-1.