Очевидно, что если вы опрашиваете входящие данные, вы должны использовать доступные данные (вызывая read ()), или они все еще будут там, и опрос немедленно вернется. Симметрично никакая операция действительно не требуется для POLLOUT, но обычно вы хотите вызвать следующую запись () как можно скорее. Так что, как правило, POLLIN -> читать, POLLOUT -> писать.
Вы должны также сбросить свою структуру pollfd перед повторным вызовом poll.
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 некоторая ошибка, номер которой указан в ошибке).
Могут также возникнуть ошибки в дескрипторах файлов, предоставленных для опроса. Они не будут делать опрос, возвращающий ошибку, но установят POLLERR, POLLHUP или POLLNVAL в поле revent структуры pollfd для этого файлового дескриптора. Если эти события установлены, при вызове read вернет код ошибки, который вы можете проверить.