У нас есть встроенная SoC под управлением BusyBox Linux (ядро 2.6.x), и нам необходимо отслеживать или, по крайней мере, своевременно замечать, когда сетевое соединение пропадает или появляется (отслеживание других событий было бы хорошо, но не обязательно) .
Я долго гуглил и читал темы SO, и, кажется, есть масса разных ответов в зависимости от конкретной задачи, конкретной ОС, фаз луны и т. д.
Наши конкретные критерии:
- Мы смотрим изнутри программы C, поэтому код C предпочтительнее, чем вызовы командной строки.
- Хотя интерфейс есть всегда, мы не можем гарантировать, что он есть или когда-либо работал (я видел комментарии к некоторым примерам, которые работают только тогда, когда интерфейс
up
, даже если ссылкаdown
) - Было бы неплохо не проводить опрос, а отправлять/перехватывать сообщения об изменении состояния по мере их возникновения. Я полагаю, что ядро уже может получать такие сообщения от драйвера, но я не уверен, есть ли что-нибудь, к чему мы можем подключиться?
Я сузил вероятные кажущиеся ответы до нескольких кандидатов, но не могу определить, какой из них самый приятный (наименее накладные, самые надежные, с наименьшей вероятностью поломки в будущих версиях):
cat sys/class/net/eth0/operstate
cat sys/class/net/eth0/carrier
(Я не могу найти хорошего объяснения разницы между этими двумя)- Использование ifreq или различных последовательностей вызовов ioctl для чтения состояния сокета (мне это кажется беспорядочным) в соответствии с ответами здесь и здесь (более аккуратный вид).
- Как-то ловить сообщения об изменении статуса???