我的任务是将一些使用 System V 队列的 C/C++ 代码从 HP-UX 移植到 Red Hat Linux (SVr4)。
大多数电话都翻译得很好,但我在一个特定问题上遇到了困难,因为它与在给定队列中发现等待的读者和作者有关。
在 HP 上,可以使用msgctl(IPC_STAT)
获取有关给定队列的详细信息的 msqid_ds 结构。
这个结构的细节中有一个 short value msqid_ds.msg_perm.mode
,它使用低 9 位来指定 user/group/others 的 r/w 权限。
但是,在 HP 上,高 7 位存储其他状态信息,其中包括以下两个标志的标志:
#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
并且显然不存在较高位信息的值。
但肯定存在维护这些队列的读取器和写入器的内核操作。我希望可以调用一些操作来发现这些信息。