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

时间:2014-12-18 10:23:25

标签: unix select ipc message-queue aix

在AIX 6.1.0.0上,选择()系统调用对消息队列的支持,请参阅http://www-01.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.basetrf2/select.htm?lang=en

但是,在select()调用后,下面的代码返回失败,错误为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;

1 个答案:

答案 0 :(得分:2)

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

select()手册页上没有提到它,但在poll() manual page上提到了该选项,同一个标志为这两个函数启用了消息队列支持。