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

Posted

技术标签:

【中文标题】消息队列 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 我投了赞成票,但因为我是 *** 的新手,所以它不会出现。

以上是关于消息队列 mq 发送错误。错误的文件描述符的主要内容,如果未能解决你的问题,请参考以下文章

mq消息存储

MQ问题及解决方案

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

消息队列-OPEN MQ

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

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