Почему revents равен 0, когда кабель отсоединен?

#c #linux #networking

#c #linux #сеть

Вопрос:

У меня есть функция для проверки состояния канала Ethernet. Когда кабель подключен, значение revents равно POLLIN. Таким образом, строка «Статус изменен» распечатывается. Но если кабель отсоединен, revents равен 0. Затем «Статус изменен». не распечатывается. Почему revents равен 0, когда кабель отсоединен? В этом случае, как я могу узнать, отключен ли кабель?

 void pollLink()
{
    struct pollfd poll_data[1];
    
    poll_data[0].fd = 0;
    poll_data[0].events = POLLIN;

    poll(poll_data, 1, 0);
    if (poll_data[0].revents == POLLIN)
    {
        printf("Status is changed.");
    }
}
 

Комментарии:

1.«Почему revents равен 0, когда кабель отсоединен?» POLLIN означает, что данные могут быть прочитаны без блокировки. Если кабель отсоединен, не будет никаких данных для чтения.

2. Возможно, вы сможете определить, что кабель отсоединен, посмотрев на POLLHUP бит revents .

3. Я проверил. Revents равен 0, когда кабель отсоединен. Бит POLLUP(0x10) всегда равен 0.