一、新建消息队列并写入一条消息
编写一个简单的函数,打开一个消息队列,并发送一条消息。发送完毕后不关闭消息,直接退出程序。
这个消息的内容是一个结构体,结构体中定义了2个int型整数和1个short型整数。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <mqueue.h>
#include <fcntl.h>
struct MsgType {
int a;
short b;
int c;
};
int main() {
mqd_t msgq_id;
struct MsgType msg1;
unsigned int prio1 = 1;
const char *file = "\mqex1";
msg1.a = 0x12345678;
msg1.b = 0xabcd;
msg1.c = 0xeeff1122;
msgq_id = mq_open(file, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, NULL);
if (msgq_id == (mqd_t) -1) {
perror("mq_open error");
exit(1);
}
if (mq_send(msgq_id, (char*) &msg1, sizeof(struct MsgType), prio1) == -1) {
perror("mq_send");
exit(1);
}
exit(1);
}
二、利用二进制查看软件查看消息缓存
这时我们查看cygwin的目录“..\cygwin64\dev\mqueue”,可以看到多了一个没有后缀名的文件,文件名与我们新建的消息队列的名称相同,大小为81kB。
使用二进制查看软件查看该文件,如下图所示。可以看到在第148字节处,出现了我们定义的结构体,结构体有字节对齐、字节序的问题,所以看到出现了12个字节的:78563412 cdab0000 2211ffee。可以看出是小端模式、4字节对齐。这证明了这个消息的确是存在一个缓存文件里了。
接下来我们把缓存文件删除,改写程序代码,在mq_send函数后面再重复发送一次,即发送2次消息。
此时打开消息缓存文件,发现除了在148字节处出现一个消息外,在8352字节处也出现了1个消息,这说明2个消息都成功发送了。两个消息之间的间隔为8352-148=8204.
已知1个消息默认大小为8192字节,8204比8192多出来的12个字节,应该是存放了消息的其它辅助信息。