4

できるように、fd で poll/epoll/select を実行できますが、msg キュー ID では実行できません。msgqueue-id を fd にする非標準の方法をいくつか見つけましたが、結局非標準です。だから私の質問は、なぜLinuxオタクはmsgキュー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はLinuxで使用できます。select/pollさらに、mq_notify()は、空の MQ がメッセージを受信したときにシグナルを受信するか、新しいスレッドを生成するオプションを提供します。これは、ブロックやポーリングを回避するもう 1 つの手段です。

于 2012-04-06T15:36:54.447 に答える
1

それがうまくいくだけではないことに驚いていますが、うまくいかない場合は、そのような携帯性のない慣行を奨励することを避けるためだと思います。メッセージキュー記述子はファイル記述子にすることができますが、必須ではありません。また、メッセージキュー記述子がファイル記述子である(したがって同じ「番号空間」を占める)と想定するコードは移植できません。

ファイル記述子が必要な場合は、メッセージキューの代わりにUnixソケットまたはその他のメカニズムを使用する方がよいでしょう。selectメッセージキューは、 /pollベースのイベント駆動型IOが通常使用されないスレッドを使用したリアルタイムプログラミングでの使用を目的としているようです。

于 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 に答える