2012-04-06 96 views
2

就像我们可以做的那样,在fd上轮询/ epoll/select,我们不能在msg队列ID上。我发现一些非标准的方法使msgqueue-id变为fd,但后来发现它是非标准的。所以我的问题是,为什么Linux的极客,未在msg队列ID上实施poll/select?这是否会导致严重的问题?为什么消息队列中没有轮询/选择机制?

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

+0

你有什么令人信服的理由来使用sysv MQ?有几个,但如果你没有使用它们,没有理由使用sysv实现。 – Duck 2012-04-06 15:46:20

+0

你好,伙伴。你的问题有什么进展吗?我使用的是没有POSIX队列的PowerPC 2.4内核,我希望能够在其上使用'select()'。 – JaxWR 2012-06-20 17:17:34

回答

10

mq_overview手册页:

轮询消息队列描述符

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

所以,你可以消息队列使用poll和朋友 - 只要确保你使用的现代变种。

+0

thnx的回复,但我在谈论sys-V消息队列。你是abt posix味精队列。 – JohnG 2012-04-06 15:39:54

1

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

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

1

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

1

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

相关问题