为什么没有轮询/选择类似于消息队列的机制?

时间:2012-04-06 14:40:53

标签: c linux linux-kernel

就像我们可以做的那样,在fd上轮询/ epoll / select,我们不能在msg队列id上。我找到了一些非标准的方法来将msgqueue-id设为fd,但是后来它是非标准的。所以我的问题是,为什么linux极客,没有在msg队列id上实现poll / select?这会导致严重问题吗?

我需要实现这种机制。我怎么能这样做?

5 个答案:

答案 0 :(得分:14)

来自mq_overview手册页:

  

轮询邮件队列描述符

     

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

所以可以在消息队列中使用poll和朋友 - 只需确保使用现代版本。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

Mat指出,POSIX MQ 可以在Linux中与select/poll一起使用。除此之外,mq_notify()为您提供了在空MQ接收消息时接收信号或生成新线程的选项。这是避免阻止或轮询的另一种方法。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

IBM AIX在System V队列上具有poll()的扩展名。但是Linux没有此功能。另一方面,Linux Posix队列实现允许对队列进行选择/轮询/ epoll。