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

消息队列mq_send调用失败:Bad file descriptor错误排查求助

为什么你的mq_send会返回"Bad file descriptor"错误?

我一眼就发现问题出在你的MQconnect函数的指针处理上,这是C语言里很容易踩的坑!

核心问题:指针参数的赋值错误

你在MQconnect里接收的是mqd_t *mq指针参数,但函数内部直接写了mq = mq_open(name, O_WRONLY);——这操作修改的是指针变量本身的副本,完全没影响到你在mqClient里定义的mq_on_server变量!

举个直白的例子:你把mq_on_server的地址传给MQconnect的mq参数,此时mq是一个局部指针,指向mq_on_server。但你给mq直接赋值mq_open的返回值,相当于让这个局部指针指向了别的地方,外面的mq_on_server还是原来的未初始化垃圾值。当你把这个无效的mq_on_server传给MQwrite调用mq_send时,自然会触发"Bad file descriptor"错误。

修复方案

修改MQconnect函数,把mq_open的返回值赋值给指针指向的变量,而不是指针本身:

int MQconnect (mqd_t * mq, char * name) { 
    //printf("hello from MQconnect\n"); 
    *mq = mq_open(name, O_WRONLY); // 用*mq修改传入的mqd_t变量
    while(*mq == -1){ 
        perror("mq_open failed, retrying"); // 建议添加错误提示,方便排查
        *mq = mq_open(name, O_WRONLY); 
    }
    if(*mq == -1){ 
        return 0; 
    } else {
        return 1; 
    }
}

额外优化建议

  • 原代码的do-while循环逻辑有问题,修复后改成先赋值再判断的while循环更合理,同时添加perror可以帮你排查队列打开失败的真实原因(比如权限不足、队列不存在)。
  • MQwrite里固定发送1024字节,但你的answer数组只有20字节,这会导致缓冲区溢出风险。建议根据实际数据长度发送,比如:
    int MQwrite (mqd_t mq, void * sendBuffer) { 
        size_t msg_len = strlen((const char*)sendBuffer) + 1; // 包含字符串结束符
        int nrOfBytes = mq_send(mq, (const char*)sendBuffer, msg_len, 10); 
        printf("\n%d", nrOfBytes); 
        return nrOfBytes; 
    }
    

内容的提问来源于stack exchange,提问作者Saef Jasem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:27:47