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

C 为什么消息队列没有类似轮询/选择的机制?,c,linux,linux-kernel,C,Linux,Linux Kernel,就像我们可以在fd上执行poll/epoll/select操作一样,我们不能在msg队列id上执行poll/epoll/select操作。我发现了一些非标准的方法来将msgqueue id设置为fd,但毕竟这是一个非标准的方法。所以我的问题是,为什么linux极客不在msg队列id上实现轮询/选择?这会导致严重的问题吗 我需要实施这种机制。我如何才能做到这一点?从手册页: 轮询消息队列描述符 在Linux上,消息队列描述符实际上是一个文件描述符,可以是 使用select(2)、poll(2)或e

就像我们可以在fd上执行poll/epoll/select操作一样,我们不能在msg队列id上执行poll/epoll/select操作。我发现了一些非标准的方法来将msgqueue id设置为fd,但毕竟这是一个非标准的方法。所以我的问题是,为什么linux极客不在msg队列id上实现轮询/选择?这会导致严重的问题吗

我需要实施这种机制。我如何才能做到这一点?

从手册页:

轮询消息队列描述符

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


因此,您可以在消息队列中使用
轮询
和好友-只需确保您使用的是现代版本。

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


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

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

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

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

thnx作为回复,但我说的是sys-V消息队列。和u是abt posix msg队列。使用sysv MQs有什么令人信服的理由?有一些,但如果您不使用它们,就没有理由使用sysv实现。你的问题有进展吗?我正在使用一个没有POSIX队列的PowerPC 2.4内核,我也希望能够在它上面使用
select()
。[TooLateComment]你把我弄丢了:你要求的是一个只使用Linux的解决方案,虽然你知道有一个只使用Linux的解决方案,但你不喜欢它,因为它是只使用Linux的。