消息队列流程:
首先,在get进程中,
1.写一个消息队列的结构体,(这个样式是Linux提供的样板,可以就这样用),
2.创建一个用来插入消息队列的结点(结构体)。
3.索引一个消息队列,键值通过ftok函数获得,通过msgrcv函数获取这个消息队列的内容。
4.在内核中除去这个队列,以免过多消息队列出现。
在send进程中
1.写一个消息队列的结构体,(这个样式是Linux提供的样板,可以就这样用),
2.创建一个用来插入消息队列的结点(结构体)。
3.索引一个消息队列,键值通过ftok函数获得,通过msgrcv函数获取这个消息队列的内容。
4.实例化一个结构体,把要写入的信息写进去结构体的成员mtext中去,把这个结构体写入消息队列。
运行get后,消息队列中没有能够读取到的东西,会堵塞,直到send内容后才能读取到东西。
————————————————
版权声明:本文为CSDN博主「木下 似水」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yanshimufeng/article/details/115409277
前面说了,key被写死,key的索引要去内核当中找到相关的ID队列,返回队列的ID,0x1234很死板,
所以我们到获取key,而key通过ftok获取(网上搜索)
ftok
系统建立IPC通讯 (消息队列、信号量和共享内存) 时必须指定一个ID值。通常情况下,该id值通过ftok函数得到。
头文件
#include <sys/types.h>
#include <sys/ipc.h>
函数原型:
key_t ftok( const char * fname, int id )
fname就是你指定的文件名(已经存在的文件名),一般使用当前目录,如:
key_t key;
key = ftok(".", 1); 这样就是将fname设为当前目录。
//id 可以随便写个字母或数字
key_t key;
key=ftok(".",'z');
printf("key id is %x\n",key);
上代码插入程序当中,以十六进制输出key,即可查看id
id一致,说明在内核找到的队列一id致,即可开始通信
问题:如果内核没有这个队列,则创建队列,但一旦过多,导致内核当中的队列很多
用完队列可不可以把它删掉?
引用 msgctl
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
参数1 :id
参数2: 手册(一般是IPC_PHID):用完把消息队列链表从内核中移除
参数3:NULL