Дамп ядра с помощью FD_SET() и очередей сообщений на cygwin
У меня есть следующий 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 */
Моя проблема в том, что код падает (с дампом ядра), когда я добавляю очередь сообщений в readSet с помощью FD_SET(), FD_SET(parentQueue,&readSet).
Страница man говорит, что в Linux mqd_t может использоваться с select(). И parentQueue соответствует действительному mqd_t, полученному с помощью mq_open(). Так почему же FD_SET () вылетает? Это потому, что на Cygwin очереди сообщений не являются файлами? Но я вижу очередь в /dev/mqueue.
1 ответ
Немного покопавшись, выявил проблему. В cygwin дескриптор файла очереди (mqd_t) имеет длину 64 бита (я использую 64-битную систему), и из-за этого дескриптор файла очереди выходит за пределы диапазона для выбора, FD_SETSIZE, что приводит к сбою FD_SET