私は、HP-UXからRed Hat Linux(SVr4)へのSystem Vキューを使用するC/C++コードを移植することを義務づけています。Linux System Vメッセージキューの待ち受けリーダー/ライターを見つけるにはどうすればよいですか?
ほとんどのコールは上手く翻訳されていますが、特定のキューで待機中の読者と作成者を検出することに関連して、特定の問題が発生しています。
HPでは、msgctl(IPC_STAT)
を使用して、特定のキューに関する詳細を含むmsqid_ds構造体を取得できます。
この構造の詳細の中には、短い値msqid_ds.msg_perm.mode
があります。この値は、ユーザー/グループ/その他のr/w権限を指定するために低い9ビットを使用します。
しかし、HP上で、より高い7ビットは2つのフラグ次のフラグを含む他の状態情報保存:
#define MSG_QWAIT 00001 /* a writer is waiting on qp->msg_cbytes */
#define MSG_FWAIT 00002 /* a writer is waiting on msgfp */
この一つは、例えば、テストすることができ、(msqid.msg_perm.mode & (MSG_RWAIT | MSG_WWAIT))
いずれかの読者が存在するかどうかを確認するために、またはライターはキューでブロックされます。
私はLinuxに移植しているので、この機能は同じではないことは明らかです。これらのフラグの定義は存在せず、msqid_ds.msg_perm.mode
の値は上位のビット情報にはっきりと存在しません。
もちろん、これらのキューの読み取り者と書き込み者が維持されるカーネル操作があります。私の希望は、この情報を発見するためにいくつかの操作を呼び出すことができるということです。
私が作業しているケースでは、少なくとも2つの方法で情報を使用します。 最初の情報は純粋に情報です。ユーザーは数十のキューを「一目で」見ることができ、行項目の1つは、少なくとも1つのプロセスが読み取り/書き込み操作でブロックされているかどうかを示します。 第2は、基本的な固定メカニズムです。ユーザーには、キューの内容を切り捨てたり、キューをまとめて削除したりするための基本的な操作がいくつかあります。これらのオプションは、使用されることはめったにありません。ロッカーが存在する場合は禁止されているものもあります。 あなたの結論は、私が得ている印象を強くし、とても感謝しています。 – cyph
ちなみに、正確なLinuxの実装やリリースを特定するのには苦労していますが、Linuxの少なくとも*いくつかのバージョンでは、msqid_dsのwwaitとrwaitのメンバーの一言の情報を見てきました。 例ref:http://www.tldp.org/LDP/lpg/node32.html これはこれがかつてLinuxに存在していたのかどうか不思議ですが、もはやそれはありません。 – cyph
LDPノードは、カーネルの* internal *ヘッダーの1つのバージョンを提示しているようです。対応するユーザー空間ヘッダーのいずれかがあなたが尋ねた情報を提示したかどうかは確信できませんが、ユーザー空間プログラムが直接カーネルメモリにアクセスすることはできないので、決してそれを(*内部カーネルデータ構造へのポインタを介して) –