消息队列 mq 发送错误。错误的文件描述符

     2023-03-10     69

关键词:

【中文标题】消息队列 mq 发送错误。错误的文件描述符【英文标题】:Message queque mq send error. Bad file descriptor 【发布时间】:2021-05-22 12:28:17 【问题描述】:

我正在尝试写入我的消息队列 (mq_send)。

这是我先打开队列然后写入队列的代码。

开幕式:

int MQconnect (mqd_t * mq, char * name)

    //printf("hello from MQconnect\n");
    do
        mq=mq_open(name, O_WRONLY);  //O_RDONLY
    while(mq==-1);

    if(mq== -1)
        return 0;
    
    else
        return 1;
    // Connects to an existing mailslot for writing Uses mq as reference pointer, so that you can     reach the handle from anywhere/
    // Should return 1 on success and 0 on fail*/

写作:

int MQwrite (mqd_t mq, void * sendBuffer) // (const char) sendBuffer

    int nrOfBytes = mq_send(mq, (const char)sendBuffer, 1024, 10);

    printf("\n%d", nrOfBytes);

    return nrOfBytes; //nrOfBytes;

    // Write a msg to a mailslot, return nr Uses mq as reference pointer, so that you can reach the handle from anywhere
    // should return number of bytes read         */

打开工作正常,但我无法写入消息队列。

mq_send return -1 作为返回值,错误信息是:

errno 的值:9 perror 打印的错误:错误的文件描述符 错误:错误的文件描述符

对上述函数的调用发生在这个函数中:

void * mqClient(void * arg)
    pthread_mutex_lock(&mutex);

    char answer[20];
    mqd_t mq_on_server;
    usleep(1000);
    int response = MQconnect(&mq_on_server, "/servermq");
    if(response==0)
        printf("something went wrong with MQconnect\n");
    
    else
        //This loop continously scans planets given by the user
        //while(!(0))
    printf("\nWrite to mailbox: ");
    scanf("%s", answer);


    MQwrite (mq_on_server, &answer);
    int c;
    while ( (c = getchar()) != '\n' && c != EOF);
    //fflush(stdout);
        //

    

    pthread_mutex_unlock(&mutex);

有人知道我为什么会收到这种错误吗?我的朋友有完全相同的代码,对他来说它正在工作。

【问题讨论】:

(mq== -1)while(mq==-1) 之后怎么可能是真的? 我的错。代码还不完善,会过一遍的。 关于:int nrOfBytes = mq_send(mq, (const char)sendBuffer, 1024, 10); 第二个参数应该是一个指针,而不是一个字符数组。建议:`int nrOfBytes = mq_send(mq, (const char*)sendBuffer, 1024, 10); 关于:scanf("%s", answer);变量answer只有20个字节,所以很容易溢出数组answer[]为了避免这个问题,使用'max characters'修饰符19。(19因为%s 总是在输入中附加一个 NUL 字节。建议:scanf("%19s", answer); 关于:MQwrite (mq_on_server, &answer); 在 C 中,对数组的裸引用会降级为数组第一个字节的地址,因此需要删除 & 【参考方案1】:

您忘记取消引用 MQconnect 中的给定指针。

int MQconnect (mqd_t * mq, char * name)

    //printf("hello from MQconnect\n");
#if 0
    /* wrong part */
    do
        mq=mq_open(name, O_WRONLY);  //O_RDONLY
    while(mq==-1);

    if(mq== -1)
#else
    /* fixed code */
    do
        *mq=mq_open(name, O_WRONLY);  //O_RDONLY
    while(*mq==-1);

    if(*mq== -1)
#endif
        return 0;
    
    else
        return 1;
    // Connects to an existing mailslot for writing Uses mq as reference pointer, so that you can     reach the handle from anywhere/
    // Should return 1 on success and 0 on fail*/

【讨论】:

我在解除引用后摆脱了错误“错误的文件描述符”,但现在我得到了一个新错误:errno 的值:14 由 perror 打印的错误:错误地址错误:错误地址 而mq_send的返回值还是-1。 您是说消息的长度为 1024,而传递的缓冲区长度仅为 20 个字节。这看起来很糟糕。 是的,我尝试将 char answer[20] 更改为 char answer[1024] 但也没有解决。关于如何防止这种情况的任何想法? @Gnoom 我投了赞成票,但因为我是 *** 的新手,所以它不会出现。

连接ibmmq原因码报2035的错误解决办法

...上,发布应用程序,通过javaclient向我的机器的队列发送消息和接收消息。mq安装成功,队列管理器、队列、通道也都建起来了,用mq自带的api检测程 查看详情

mq中将消息发送至远程队列的配置

MQ中将消息发送至远程队列的配置摘自MQ资源管理器帮助文档V7在开始学习本教程之前,您需要从系统管理员处了解标识网络上接收机器的名称:IP地址、MQ的端口号、队列管理器、接收(远程机器)或者是发送的队列(本地机器... 查看详情

将消息发送到我机器上的消息队列.....错误“无效的队列路径名”[关闭]

】将消息发送到我机器上的消息队列.....错误“无效的队列路径名”[关闭]【英文标题】:Sendingmessagetomessagequeueonmymachine.....Error"Invalidqueuepathname"[closed]【发布时间】:2012-08-2915:14:51【问题描述】:我正在向运行WindowsServer20... 查看详情

mq消息存储

comitlog文件ConsumerQueue文件IndexFile文件RocketMQ将所有主题的消息存储在同一个文件中,确保消息发送时顺序写文件。为了提高消息消费的效率RocketMQ引入了ConsumeQueue消息队列文件,每个消息主题包含一个多个消息消费队列,每一个... 查看详情

多次使用 socketpair 函数的文件描述符时出现“错误的文件描述符”错误

...描述】:以下代码使用套接字对从子进程向其父进程发送消息。#include<sys/types.h&g 查看详情

mq问题及解决方案

1.消息重复消费问题:当消息被重复消费时,可能会导致一些严重的问题,例如数据错误或重复处理等。解决方案是使用消息队列中提供的消息去重机制,例如使用消息id或消息唯一标识符来避免重复消费。2.消息丢失问题:消息... 查看详情

mq面试题

...注册完成,再加一个发送微信通知。只需要新增发送微信消息模块,从MQ中读取任务,发送消息即可。无需改动注册模块的代码,这样注册模块与发送模块通过MQ解耦。流量削峰:秒杀和抢购等场景经常使用MQ进行流量削峰。活动... 查看详情

消息队列(mq)是啥?

是生产者先将消息投递一个叫队列的容器中,然后再从这个容器中取出消息,最后再转发给消费者。消息队列是Microsoft的消息处理技术,它在任何安装MicrosoftWindows的计算机组合中,为任何应用程序提供消息处理和消息队列功能... 查看详情

mq关于实现最终一致性分布式事务原理解析(代码片段)

...通过MQ实现分布式事务最终一致性原理 概念介绍事务消息:消息队列MQ提供类似X/OpenXA的分布式事务功能,通过消息队列MQ事务消息能达到分布式事务的最终一致。半事务消息:暂不能投递的消息,发送方已经成功地将消息发... 查看详情

mq消息队列的12点核心原理总结

1.消息生产者、消息者、队列消息生产者Producer:发送消息到消息队列。消息消费者Consumer:从消息队列接收消息。Broker:概念来自与ApacheActiveMQ,指MQ的服务端,帮你把消息从发送端传送到接收端。消息队列Queue:一个先进先出的... 查看详情

错误记录:mqje001:完成代码为'2',原因为'2035'。

...q7.5服务端,建立队列。通过javaclient向我的机器的队列发送消息和接收消息。mq安装成功,队列管理器、队列、通道也都建起来了,用mq自带的api检测程序检测也成功了。接下来,在另外一台机器上通过程序发送消息,结果就是不... 查看详情

尝试访问时带有结构的 C mq_receive() 会导致段错误

...间】:2020-07-1606:10:16【问题描述】:所以我有两个连接到消息队列的程序,一个以结构的形式向另一个发送消息。但是,当我在收到该结构后尝试访问它时,会出现分段错误。我不知道在结构发送后我需要做什么才能访问它。这... 查看详情

mq入门总结消息队列概念和使用场景

一、消息队列消息即是信息的载体。为了让消息发送者和消息接收者都能够明白消息所承载的信息(消息发送者需要知道如何构造消息;消息接收者需要知道如何解析消息),它们就需要按照一种统一的格式描述消息,这种统一... 查看详情

ibm的mq创建管理器时间太长

...mmq队列和通道的区别mq队列管理器不可用initqibmmq查看队列消息ibmmq通道信息查看saveqmgr导入导出mqmq查看本地队列属性mq消息堵塞在传输队列endmqm停不掉ibmmq清除队列消息命令rabbitmq打开mq队列失败IBMMQibmmq查看通道状态重启mq队列管... 查看详情

骆驼路由消息到replyTo和错误队列

】骆驼路由消息到replyTo和错误队列【英文标题】:CamelroutemessagetoreplyToanderrorqueue【发布时间】:2018-09-0200:47:08【问题描述】:我是骆驼的新手。我尝试实现以下行为。我收到带有已填充JMSReplyTo标头的消息。当抛出任何异常时,... 查看详情

WebSphere MQ/MQSeries - 可以通过一次调用将消息发送到多个队列吗?

】WebSphereMQ/MQSeries-可以通过一次调用将消息发送到多个队列吗?【英文标题】:WebSphereMQ/MQSeries-Possibletosendamessagetomultiplequeueswithsinglecall?【发布时间】:2010-11-0500:12:34【问题描述】:我正在使用我的Oracle数据库中的存储过程将消... 查看详情

mq系列——mq简介(代码片段)

mq简介mq就是消息队列(MessageQueue)。想必大家对队列的数据结构已经很熟悉了,消息队列可以简单理解为:把要传输的数据放在队列中,mq就是存放和发送消息的这么一个队列中间件。在消息队列中,把数据放到消息队列的角色... 查看详情

ibmmq介绍

...d308b3b7ecce3ec14cecb4f.htmlIBMMQ(IBMMessageQueue)是IBM的一款商业消息中间产品,适用于分布式计算环境或异构系统之中。消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应... 查看详情