できるように、fd で poll/epoll/select を実行できますが、msg キュー ID では実行できません。msgqueue-id を fd にする非標準の方法をいくつか見つけましたが、結局非標準です。だから私の質問は、なぜLinuxオタクはmsgキューIDにpoll/selectを実装していないのですか? それは深刻な問題につながりますか?
そのようなメカニズムを実装する必要があります。どうやってやるの ?
できるように、fd で poll/epoll/select を実行できますが、msg キュー ID では実行できません。msgqueue-id を fd にする非標準の方法をいくつか見つけましたが、結局非標準です。だから私の質問は、なぜLinuxオタクはmsgキューIDにpoll/selectを実装していないのですか? それは深刻な問題につながりますか?
そのようなメカニズムを実装する必要があります。どうやってやるの ?
mq_overview
マニュアルページから:
メッセージキュー記述子のポーリング
Linuxでは、メッセージキュー記述子は実際にはファイル記述子であり、select(2)、poll(2)、またはepoll(7)を使用して監視できます。これは移植性がありません。
したがって、メッセージキューで友達を使用できます。最新のバリアントを使用していることを確認してください。poll
Mat が指摘しているように、POSIX MQはLinuxで使用できます。select/poll
さらに、mq_notify()は、空の MQ がメッセージを受信したときにシグナルを受信するか、新しいスレッドを生成するオプションを提供します。これは、ブロックやポーリングを回避するもう 1 つの手段です。
それがうまくいくだけではないことに驚いていますが、うまくいかない場合は、そのような携帯性のない慣行を奨励することを避けるためだと思います。メッセージキュー記述子はファイル記述子にすることができますが、必須ではありません。また、メッセージキュー記述子がファイル記述子である(したがって同じ「番号空間」を占める)と想定するコードは移植できません。
ファイル記述子が必要な場合は、メッセージキューの代わりにUnixソケットまたはその他のメカニズムを使用する方がよいでしょう。select
メッセージキューは、 /poll
ベースのイベント駆動型IOが通常使用されないスレッドを使用したリアルタイムプログラミングでの使用を目的としているようです。
SysV MsgQ は、IPC_WAIT を使用して、特定のメッセージ タイプまたは任意のメッセージ タイプの msgrcv() 呼び出しをブロックするためのプロビジョニングを提供します。poll/epoll/select は、ユーザー アプリケーションが特定のイベントのポーリングで CPU サイクルを浪費せず、カーネルのより良い判断に任せるイベント駆動型プログラムを作成するのに役立ちます。これは、SysV msg Q を使用して達成することもできます。