消息队列(2):消息存哪里了?

一、新建消息队列并写入一条消息

编写一个简单的函数,打开一个消息队列,并发送一条消息。发送完毕后不关闭消息,直接退出程序。

这个消息的内容是一个结构体,结构体中定义了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个字节,应该是存放了消息的其它辅助信息。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值