Unix select()消息队列在AIX 6.1.0.0上作为错误地址(EFAULT)失败

Unix select()消息队列在AIX 6.1.0.0上作为错误地址(EFAULT)失败,unix,select,ipc,message-queue,aix,Unix,Select,Ipc,Message Queue,Aix,在AIX 6.1.0.0上,选择()消息队列的系统调用支持,请参阅 但是调用select()后,以下代码返回失败,错误号为14(EFAULT): int msgid=msgget(MQ_键,IPC_创建| 06666); 如果(-1==msgid){ if(errno!=EEXIST){ ETRACE(“msgget()失败:键[%d],错误号[%d]”,MQ_键,错误号); 返回-1; } msgid=msgget(MQ_键,0); 如果(-1==msgid){ ETRACE(“msgget(

在AIX 6.1.0.0上,选择()消息队列的系统调用支持,请参阅

但是调用select()后,以下代码返回失败,错误号为14(EFAULT):

int msgid=msgget(MQ_键,IPC_创建| 06666);
如果(-1==msgid){
if(errno!=EEXIST){
ETRACE(“msgget()失败:键[%d],错误号[%d]”,MQ_键,错误号);
返回-1;
}
msgid=msgget(MQ_键,0);
如果(-1==msgid){
ETRACE(“msgget()失败:键[%d],错误号[%d]”,MQ_键,错误号);
返回-1;
}
}
DTRACE(“msgget()成功:msgid[%d]”,msgid);
/*暂停*/
结构timeval to;
to.tv_sec=10;
to.tv_usec=0;
/*选择列表*/
结构{
int msgids[1];
}rlist,wlist,elist;
rlist.msgids[0]=msgid;
wlist.msgids[0]=msgid;
elist.msgids[0]=msgid;
/*名单数目*/

select()
poll()
中的int-nlist=1消息队列支持是在AIX 5.3及更高版本上编译时默认不再启用的AIX扩展。要启用它,请在第一个
#include
之前使用
-D#MSGQSUPPORT
(或
#define#MSGQSUPPORT 1
)进行编译


select()
manual页上没有提到它,但在上提到了该选项,并且相同的标志启用了对这两个函数的消息队列支持。

AIX 6.1.0.0手册中关于select()中的第一个参数
Nfdsmsgs
所述低阶16位给出位掩码的长度,该位掩码指定要检查的文件描述符;高阶16位表示包含消息队列标识符的数组的大小。而
rlist
是存储在msgid中的结构。
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;