You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

消息队列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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:13:52