在cygwin上使用FD_SET()和消息队列进行核心转储

在cygwin上使用FD_SET()和消息队列进行核心转储,c,io,cygwin,nonblocking,C,Io,Cygwin,Nonblocking,我有以下C代码用于设置select()以侦听TCP套接字和消息队列上的传入数据: fd_set readSet; u32 maxFD = 0; mqd_t parentQueue; int serverSocket; /* not shown: parentQueue and serverSocket were successfully opened */ FD_ZERO(&readSet); FD_SET(serverSocket,&readSet); FD_SET(par

我有以下C代码用于设置select()以侦听TCP套接字和消息队列上的传入数据:

fd_set readSet;
u32 maxFD = 0;
mqd_t parentQueue;
int serverSocket;

/* not shown: parentQueue and serverSocket were successfully opened */

FD_ZERO(&readSet);
FD_SET(serverSocket,&readSet);
FD_SET(parentQueue,&readSet);

/* next, not shown: block with select() and I/O processing */ 
我的问题是,当我添加消息队列时,代码崩溃(核心转储) 要使用FD_SET()、FD_SET(parentQueue,&readSet)读取集,请执行以下操作


手册页说,在Linux上,mqd_t可以与select()一起使用。parentQueue对应于使用mq_open()获得的有效mqd_t。那么为什么FD_SET()会崩溃呢?是否因为在Cygwin上,消息队列不是文件?但是我可以在/dev/mqueue中看到队列。

经过一点挖掘,我发现了问题所在。在cygwin上,队列文件描述符(mqd_t)的长度为64位(我使用的是64位系统),因此队列文件描述符超出了select、FD_SETSIZE的范围,导致FD_SET崩溃