Очевидно, что если вы проводите опрос входящих данных, вы должны использовать доступные данные (вызов read()), или он все равно будет там, и опрос будет немедленно возвращен. Симметрично никакой операции не требуется для POLLOUT, но вы обычно хотите вызвать следующую запись() как можно скорее. Итак, как правило, POLLIN -> read, POLLOUT -> write.
Вы также должны сбросить структуру pollfd перед повторным вызовом опроса.
fds[0].fd = sck;
fds[0].events = POLLIN;
fds[0].revents = 0;
ret = poll(fds, 1, 2000); //2 secs timeout
if(fds[0].revents & POLLIN && ret > 0)
{
printf("event occur\n");
}
Если вы не сбросить его каждый раз, мусор от предыдущего вызова может изменить поведение опроса (ну, не совсем, это просто вопрос переносимости).
В производственном коде вы также должны проверить возвращаемое значение, поскольку опрос может быть прерван по другой причине, чем ожидаемое событие (например, сигнал). Затем вы обычно хотите называть это снова, вместо того, чтобы читать данные, которые недоступны (в качестве напоминания возвращаемое значение опроса - это количество событий, 0 тайм-аутов, -1 некоторая ошибка, число которых в errno).
Ошибки в дескрипторах файлов, предоставленные для опроса, также могут возникать. Они не будут возвращать опрос опроса, но устанавливают POLLERR, POLLHUP или POLLNVAL в поле revent структуры pollfd для этого файлового дескриптора. Если эти события установлены, вызов read вернет код ошибки, который вы можете проверить.
Спасибо, но мне не нужно читать эти данные. Для меня важно то, что есть событие. Думаешь, мне нужно это прочитать. Есть ли способ очистить буфер? – domlao
Я думаю, вы должны прочитать эти данные. –
Я вижу, спасибо, я думаю, что нужно это сделать. – domlao