【发布时间】:2015-02-17 02:32:18
【问题描述】:
在 AIX 6.1.0.0 上,消息队列的 select() 系统调用支持,请参阅 http://www-01.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.basetrf2/select.htm?lang=en
但在调用 select() 后,下面的代码返回失败,出现 errno 14(EFAULT):
int msgid = msgget(MQ_KEY, IPC_CREAT|06666);
if (-1 == msgid) {
if (errno != EEXIST) {
ETRACE("msgget() failed: key[%d], errno[%d]", MQ_KEY, errno);
return -1;
}
msgid = msgget(MQ_KEY, 0);
if (-1 == msgid) {
ETRACE("msgget() failed: key[%d], errno[%d]", MQ_KEY, errno);
return -1;
}
}
DTRACE("msgget() success: msgid[%d]", msgid);
/* time out */
struct timeval to;
to.tv_sec = 10;
to.tv_usec = 0;
/* select list */
struct {
int msgids[1];
} rlist, wlist, elist;
rlist.msgids[0] = msgid;
wlist.msgids[0] = msgid;
elist.msgids[0] = msgid;
/* number of list */
int nlist = 1 << 16;
/* int ret = select(nlist, (struct fd_set*)&rlist, (struct fd_set*)&wlist, (struct fd_set*)&elist, &to); */
int ret = select(nlist, (struct fd_set*)&rlist, NULL, NULL, &to);
if (0 == ret) {
WTRACE("select() timeout: ret[%d]", ret);
}
else if (ret < 0) {
ETRACE("select() failed: ret[%d], errno[%d]", ret, errno);
}
else {
ITRACE("select() success");
}
return 0;
【问题讨论】:
-
int nlist = 1 << 16;可能有点太大了。还有...rlist.msgids[0] = msgid;rlist 是什么? -
在 AIX 6.1.0.0 的手册中,关于 select() 中的第一个参数
Nfdsmsgs说 低 16 位给出了位掩码的长度,该位掩码指定哪个要检查的文件描述符;高 16 位给出了包含消息队列标识符的数组的大小。 而rlist是存储的结构体 msgid。
标签: unix select ipc message-queue aix