私は、System V キューを使用する C/C++ コードを HP-UX から Red Hat Linux (SVr4) に移植する任務を負っています。
ほとんどの呼び出しは問題なく変換されましたが、特定のキューで待機中のリーダーとライターを検出することに関連する特定の問題が 1 つあります。
HP ではmsgctl(IPC_STAT)
、特定のキューに関する詳細を含む msqid_ds 構造体を取得するために使用できます。
この構造体の詳細には short 値msqid_ds.msg_perm.mode
があり、下位 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
は明らかに上位ビット情報がありません。
しかし、確かに、これらのキューのリーダーとライターが維持されるカーネル操作があります。この情報を発見するために何らかの操作を呼び出すことができることを願っています。