Дамп ядра с помощью 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

Другие вопросы по тегам