【发布时间】:2017-02-09 12:45:16
【问题描述】:
我的任务是将一些使用 System V 队列的 C/C++ 代码从 HP-UX 移植到 Red Hat Linux (SVr4)。
大部分调用都翻译得很好,但我在一个特定问题上遇到了困难,因为它与在给定队列中发现等待的读者和作者有关。
在 HP 上,可以使用msgctl(IPC_STAT) 来获取包含给定队列详细信息的 msqid_ds 结构。
这个结构的细节中有一个短值msqid_ds.msg_perm.mode,它使用低9位来指定用户/组/其他的读/写权限。
但是,在 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 的值显然不存在高位信息。
但肯定存在维护这些队列的读取器和写入器的内核操作。我希望可以调用一些操作来发现这些信息。
【问题讨论】: