为什么消息队列中没有轮询/select机制?

就像我们可以做的,轮询/ epoll /select一个FD,我们不能在消息队列ID。 我发现一些非标准的方法使msgqueue-id为fd,但是最后却是非标准的。 所以我的问题是,为什么Linux的极客,没有实施轮询/select的味精队列ID? 这是否会导致严重的问题?

我需要实施这样的机制。 我怎样才能做到这一点 ?

Solutions Collecting From Web of "为什么消息队列中没有轮询/select机制?"

mq_overview手册页:

轮询消息队列描述符

在Linux上,消息队列描述符实际上是一个文件描述符,可以使用select(2),poll(2)或epoll(7)来监视。 这不是便携式的。

因此,您可以在消息队列中使用poll和朋友 – 只要确保使用现代变体。

我感到惊讶的是,这不仅仅是工作,而且如果没有,我怀疑是为了避免鼓励这种不可移植的做法。 虽然消息队列描述符被允许为文件描述符,但它们并不是必需的,而假定它们是文件描述符的代码(因此占用相同的“数字空间”)是不可移植的。

如果你需要文件描述符,你最好使用Unix套接字或其他机制代替消息队列。 消息队列似乎旨在用于通常不使用基于select / poll的事件驱动IO的线程的实时编程。

正如Mat指出的那样,POSIX MQs 可以在Linux中用于select/poll 。 除此之外, mq_notify()为您提供接收信号的选项,或者在空MQ收到消息时产生新线程的选项。 这是避免阻塞或投票的另一种方法。

SysV MsgQ使您可以使用IPC_WAIT来阻止对特定消息类型或任何消息类型的msgrcv()调用。 Poll / epoll / select用于帮助您编写一个事件驱动的程序,其中用户应用程序不会浪费CPU周期轮询特定事件,并使其更好地判断内核。 这也是你可以使用SysV msg Q来实现的。