Мне интересно использовать netlink для простого приложения (чтение статистики cgroup на высокой частоте).
Страница man предупреждает, что протокол ненадежен, намекая на то, что приложение необходимо быть готовым к обработке пропущенных пакетов:
Однако надежная передача от ядра к пользователю невозможна в любом случае. Ядро не может отправить сообщение netlink, если буфер сокета заполнен: сообщение будет удалено, и ядро и процесс пользовательского пространства больше не будут иметь одинаковое представление о состоянии ядра. Приложение должно определить, когда это происходит (с помощью ошибки ENOBUFS
, возвращаемой recvmsg(2)
), и выполнить повторную синхронизацию.
Поскольку мои требования просты, я могу просто уничтожить сокет и создание нового всякий раз, когда происходит что-то неожиданное. Но я не могу найти никакой документации о том, что ожидают от моей программы - на странице man для recvmsg(2)
даже не упоминается ENOBUFS
, например.
Что все делают Мне нужно беспокоиться, чтобы убедиться, что я могу сказать, что запрос от моего приложения или ответ от ядра был отброшен, чтобы я мог сбросить все настройки и начать все сначала? Для меня ясно, что я мог бы делать это всякий раз, когда получаю ошибку от любого из задействованных системных вызовов, но, например, что произойдет, если мой запрос будет отброшен по пути к ядру? Я просто никогда не получу ответ? Нужно ли создавать механизм тайм-аута, в котором я так долго жду ответа?