4

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

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

4

5 回答 5

17

mq_overview手册页:

轮询消息队列描述符

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

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

于 2012-04-06T14:49:39.093 回答
4

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

于 2012-04-06T15:36:54.447 回答
1

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

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

于 2012-04-06T14:51:09.887 回答
1

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

于 2013-10-08T13:09:20.330 回答
0

IBM AIX 在 System V 队列上具有 poll() 扩展。但是Linux没有这个特性。另一方面,Linux Posix 队列实现允许对队列进行 select/poll/epoll。

于 2020-03-21T22:18:38.850 回答