消息队列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
相关产品推荐
相关产品推荐

