我目前正在开发一个通过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
的那一刻,接收区中没有其他人......
答案 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)