消息队列msqid_ds结构体参数异常及发送时间值问题咨询
消息队列msqid_ds结构体参数返回异常值的问题排查
我来帮你分析下这个问题,结合你的代码片段来看,大概率是下面几个原因导致的:
1. 没有调用msgctl获取队列的实时状态
你的代码只调用了msgget来创建或获取消息队列,但msqid_ds结构体的内容不会自动被内核填充。要拿到队列的真实状态(包括消息发送时间、队列长度这些核心参数),必须调用msgctl的IPC_STAT命令,从内核中同步最新数据。如果跳过这一步,info结构体里的字段都是内存中的随机垃圾值,自然会出现看起来异常的数字。
你需要在msgget之后加上这段关键代码:
// 从内核同步队列最新状态到info结构体 if (msgctl(msgid, IPC_STAT, &info) == -1) { perror("msgctl IPC_STAT failed"); exit(EXIT_FAILURE); }
2. 这个“异常值”其实是合法的Unix时间戳
你看到的1525240214是标准的Unix时间戳(从1970年1月1日0点开始计算的秒数),转换成人可读的时间是2018年5月1日左右。如果这个消息队列是之前创建的,或者你的系统时间有偏差,这个时间戳是完全正常的。你可以用ctime函数把它转换成字符串格式验证:
printf("最后消息发送时间:%s", ctime(&info.msg_stime));
3. 权限不足导致msgctl调用失败
如果消息队列是其他用户创建的,当前用户没有读取队列状态的权限,msgctl会调用失败,此时info结构体依然是未初始化的状态,字段值还是垃圾值。一定要检查msgctl的返回值,避免忽略错误。
修正后的完整代码片段参考
#include <stdio.h> #include <stdlib.h> #include <sys/msg.h> #include <sys/ipc.h> #include <time.h> struct mesg_q { char msg_txt[100]; long msg_typ; }; int main() { int msgid; struct mesg_q msgq; struct msqid_ds info; // 创建或获取消息队列 msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if (msgid == -1) { perror("msgget failed"); exit(EXIT_FAILURE); } // 同步队列状态到info结构体 if (msgctl(msgid, IPC_STAT, &info) == -1) { perror("msgctl failed"); exit(EXIT_FAILURE); } // 打印可读的时间戳 printf("最后消息发送时间:%s", ctime(&info.msg_stime)); printf("最后消息接收时间:%s", ctime(&info.msg_rtime)); return 0; }
内容的提问来源于stack exchange,提问作者user9478215
相关产品推荐
相关产品推荐

