消息队列错误的文件描述符错误

Message queue bad file descriptor error

本文关键字:错误 描述 文件 队列 消息      更新时间:2023-10-16

我编写了一个简单的应用程序来理解POSIX消息队列。但该应用程序不断给出"错误的文件描述符"错误。

感谢stackoverflow用户。我们找到了解决方案。以下是更新后的代码。

#include <mqueue.h>
#include <string.h>
#include <iostream>
#include <errno.h>
using namespace std;
int main(int argc, char *argv[])
{
    mqd_t messageQueue;
    mq_attr attr;
    messageQueue = mq_open("/test",O_RDWR|O_CREAT,0664,&attr);
    attr.mq_maxmgs = 10;
    attr.mq_msgsize = 4;
    char c;
    int pid = fork();
    //client
    if(pid == 0) {
        if(mq_receive(messageQueue,&c,1,0) == -1)
            cout<<"Error:"<<strerror(errno)<<"n";
        cout<<"Received:"<<c<<"n";
    }
    //server
    else if(pid > 0) {
        c = 'a';
        if(mq_send(messageQueue,&c,1,0) == -1)
            cout<<"Error:"<<strerror(errno)<<"n";
        cout<<"Send:"<<c<<"n";
        mq_close(messageQueue);
    }
    else {
        cout<<"Fork errorn";
    }
    return 0;
}

由于为mq_open提供了O_CREAT标志和属性列表,因此应将attr.mq_maxmsgattr.mq_msgsize显式设置为正值。

由于接收缓冲区大小不大于mq_msgsize属性,因此存在

错误。只需做两件事,一个数组说charc1[50],一个指向它的指针说char*ptr=c1;在receive方法中传递这个指针,当u打印消息打印c1[0]时,就这样了。还将接收方法中的大小更新为50,而不是1。