Чарли,
Пара вещей:
1) Вероятно, вам следует зациклить ваш вызов select () и ТОЛЬКО вызвать recvfrom, если FD_ISSET () возвращает true в вашем файловом дескрипторе.
2) Убедитесь, что ваш фактический драйвер или код ядра, который отправляет через сокет netlink, действительно записывает / отправляет данные в него. Если нет, то ваша функция будет отключена, если она не получит данные в течение 1 секунды. (это то, на что вы установили тайм-аут).
Пара общих комментариев ...
В Linux при использовании системного вызова select (). структура данных тайм-аута сбрасывается после каждого вызова, поэтому, если вы измените свой код на цикл вокруг select, что вам, вероятно, следует ... вам придется сбрасывать значение тайм-аута для каждой итерации в цикле.
Кроме того, если время ожидания выбрано, это не обязательно означает, что это ошибка. Помните, что выбор является неблокирующим вызовом. Он просто будет ждать в сокете в течение заданного периода ожидания и вернется. Если вы хотите читать из файлового дескриптора, несмотря ни на что ... то есть вы хотите, чтобы ваша функция recv_kern () блокировалась до тех пор, пока не будут возвращены данные, тогда не беспокойтесь об использовании select (). Просто вызовите recvfrom () прямо в дескрипторе файла. Таким образом, ваша функция recv_kernel () будет блокироваться и возвращаться только после чтения данных, отправленных ядром.
Здесь довольно сложно дать более конкретную помощь, не зная больше о том, как используется этот код. Я предполагаю, что это пользовательский модуль ядра, который вы написали для отправки данных в пользовательское пространство, правильно?
Попробуйте изменить функцию recv_kern () на блокирование (уберите код выбора и просто вызовите recvfrom ()). Таким образом, вы сможете определить, правильно ли драйвер вашего ядра отправляет данные в пользовательское пространство. Если вы блокируете функцию recvfrom () и ничего не возвращается ... тогда у вас также может быть проблема в драйвере ядра.
Надеюсь, это поможет.