【问题标题】:bad file descriptor while reading posix message queue读取posix消息队列时文件描述符错误
【发布时间】:2020-05-30 04:57:01
【问题描述】:

存在类似的线程,但它们都没有帮助。在 linux 下使用以下代码阅读时出现错误的文件描述符错误。 在使用 O_CREAT 标志进行创建时,我还指定了队列属性。 任何想法?谢谢。

#include <stdio.h>
#include <mqueue.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>


#define Log(...) printf(__VA_ARGS__); fflush(stdout)
int error;

void* producer(void* arg)   {
    Log("producer\n");

    mqd_t q = mq_open("/ytm", O_RDWR);
    mq_send(q, "kardeshians", sizeof("kardeshians"), 1);

}


void* consumer(void* arg)    {

    Log("consumer\n");
    char buff[32];
    mqd_t q = mq_open("/ytm", O_RDONLY);
    int prio;

    while(1)    {
        error =  mq_receive(q,buff,sizeof(buff), NULL);
        if(error)   {
            printf("read error %d  %s\n", errno, strerror(errno));
        }
    }

}



int main()  {

    struct mq_attr attr;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 32;
    mqd_t queue = mq_open("/ytm", O_CREAT | O_RDWR, 0, &attr);


    pthread_t tid;
    pthread_create(&tid, 0 , producer, 0);
    pthread_create(&tid, 0 , consumer, 0);


    while(1);
}

【问题讨论】:

  • 检查所有库函数的返回码,在你的情况下尤其是mq_open,它会在错误时返回(mqd_t) -1并设置errno。您的 if(error) 检查非零值。 mq_receive 将在成功时返回字节数,在错误时返回 -1,因此您应该使用例如if(error &lt; 0)
  • mq_open 成功了吗?
  • 如果处理 posix 函数,请总是检查返回值。您可以使用strace 来查看如果您的 prog 以纯文本形式运行会发生什么。无论如何使用系统调用非常有帮助。

标签: c linux posix message-queue


【解决方案1】:

问题在于执行权限和消息大小。在以 root 身份运行并使读取缓冲区大小大于 mq_msgsize 之后,它就可以工作了。 感谢您提供错误检查建议。这是工作代码:

#include <stdio.h>

#include <mqueue.h>
#include <pthread.h>

#include <errno.h>
#include <string.h>


#define Log(...) printf(__VA_ARGS__); fflush(stdout)
int error;

void* producer(void* arg)   {
    Log("producer\n");

    mqd_t q = mq_open("/ytm", O_RDWR);

    if(q == -1)  {
        printf("mq_open error %d  %s\n", errno, strerror(errno));
        exit(0);
    }

   while(1) {
        int retval = mq_send(q, "kardeshians\n", sizeof("kardeshians\n"), 1);

        if(retval == -1)    {
            printf("mq_open error %d  %s\n", errno, strerror(errno));
            exit(0);
        }
   }


}


void* consumer(void* arg)    {

    Log("consumer\n");
    char buff[64];
    mqd_t q = mq_open("/ytm", O_RDONLY);
    int prio;

    while(1)    {
        int retval =  mq_receive(q,buff,sizeof(buff), NULL);
        if(retval ==  -1)   {
            printf("read error %d  %s\n", errno, strerror(errno));
        } else {
            printf("got message : %s", buff);
        }
    }

}



int main()  {

    struct mq_attr attr;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 32;
    mq_unlink ("/ytm");
    mqd_t queue = mq_open("/ytm", O_CREAT | O_RDWR, 0, &attr);


    pthread_t tid;
    pthread_create(&tid, 0 , producer, 0);
    pthread_create(&tid, 0 , consumer, 0);


    while(1);
}

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 2020-08-10
    • 2021-05-22
    • 2021-10-10
    • 2015-02-11
    • 2016-03-21
    • 2013-10-30
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多