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