如何清除POSIX消息队列?

时间:2016-02-22 07:42:59

标签: c++ posix message-queue

我目前正在开发一个通过Posix Message Queues进行IPC的程序。我现在需要一个删除该队列的每条消息的函数。问题是:我的代码死锁。目前我正在尝试以下方法:

void clear_mq(std::string queue_name)
{
    struct mq_attr mq_attrs = {0, 10, sizeof(uint8_t), 0};

    mqd_t mq = ::mq_open(queue_name.c_str(), O_WRONLY | O_CREAT, 00644, &mq_attrs);

    if (mq < 0)
    {
        std::cout << "Error opening Queue" << std::endl;
        exit(-1);
    }

    struct mq_attr num_messages;
    if (mq_getattr(mq, &num_messages) == -1)
    {
        std::cout << "Error!" << std::endl;
        exit(-1);
    }
    while (num_messages.mq_curmsgs > 0)
    {
        uint8_t buf;
        mq_receive(mq, (char *)&buf, sizeof(uint8_t), NULL);
        if (mq_getattr(mq, &num_messages) == -1)
        {
            std::cout << "Error!" << std::endl;
            exit(-1);
        }
    }
    mq_close(mq);
}

有谁可以指出我做错了什么?我不明白接收为什么会阻塞......在我致电clear_mq的那一刻,接收区中没有其他人......

3 个答案:

答案 0 :(得分:1)

可能是mq_receive()失败了,你最终会陷入无休止的循环。

mq_receive()可能由于各种原因而失败,例如提供的缓冲区必须至少具有mq-maxsize的大小。

你应该检查mq_receive()的返回值,如果失败则退出循环。

答案 1 :(得分:0)

你恕我直言,没有僵局。但是,mq_receive阻塞,直到收到消息(man mq_receive),因为队列未在mq_open时使用O_NONBLOCK参数打开。

请确保您不要忽略循环中mq_receive的返回值。

答案 2 :(得分:0)

万一其他人有问题。

在打印errno时出现错误9(错误的文件描述符),这是有道理的,因为仅打开了消息队列以进行写入,但您尝试从中读取消息。当您使用O_RDWR打开队列时,请参见mq_open

调试提示请使用mq_timedreceive,以便您检查错误。