2012-04-06 45 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來實現的問題。

相關問題