2010-06-11 2 views
8

Я использую Linux как свою платформу программирования. Я использую poll(2), чтобы узнать, запускает ли мое устройство событие.poll (2) не пустит очередь событий

Первый звонок poll в порядке; он блокирует и ждет события. Но во втором вызове функции poll он вернется; но он захватывает событие. Ниже мой код.

ret = poll(fds, 1, 2000); //2 secs timeout 

if(fds[0].revents & POLLIN && ret > 0) 
{ 
    printf("event occur\n"); 
} 

Кажется, что очередь/буфер не пуст. Я просто предполагаю.

Как вы думаете, а проблема?

Спасибо.

ответ

5

Если у вас есть событие POLLIN, что означает «Есть данные для чтения» - вы называете функцию read() на вашем fd перед poll() 'ing снова?

+0

Спасибо, но мне не нужно читать эти данные. Для меня важно то, что есть событие. Думаешь, мне нужно это прочитать. Есть ли способ очистить буфер? – domlao

+0

Я думаю, вы должны прочитать эти данные. –

+0

Я вижу, спасибо, я думаю, что нужно это сделать. – domlao

11

Очевидно, что если вы проводите опрос входящих данных, вы должны использовать доступные данные (вызов 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 вернет код ошибки, который вы можете проверить.

+0

спасибо. на самом деле я всегда меняю значения в своей структуре, и я считаю, что лучшим решением является чтение доступных данных. – domlao

+0

Спасибо, но кажется, что я получаю сообщение об ошибке в моем вызове функции чтения, кажется, что он возвращает значение -1, errno говорит, что аргумент недействителен, но я уверен, что параметры верны. – domlao

+0

Я добавил несколько строк для проверки ошибок. Скорее всего, если ваш первый опрос остановится с тайм-аутом или ошибкой. Обычно я использую оператор switch после каждого опроса для управления случаем ошибки и таймаута, по умолчанию для обычного случая, когда произошли некоторые события. В любом случае, если вы читаете, вы должны иметь ошибку. Является ли ваш дескриптор файла в порядке? Может быть, open failed, или не для чтения, или файл закрыт ... ну, не нужно угадывать, проверить ошибку. – kriss

4

Считается, что проверять на наличие POLLHUP или POLLNVAL перед чтением дескриптора файла. Тем не менее, я считаю, что read() просто потерпит неудачу, если это так, , если не будет опробован файловый дескриптор, который, как ожидается, будет блокироваться на длительные периоды, например, модем. В этом случае вы зависаете (в зависимости от того, что вы передали open()).

Вы, вероятно, не:

  • Чтение событий FD вообще до следующего poll(), или,
  • Чтение всех имеющихся данных.

Если инициализировать массив структура pollfd перед вызовом poll(), не должно быть никакого «мусора», чтобы говорить.

Тем не менее, это, вероятно, хорошая идея, чтобы проверить и убедиться, что есть что-то, что стоит беспокоиться read(), чтобы сделать это до его вызова.

+0

Спасибо, я прочитал некоторые данные, но кажется, что чтение возвращает нулевое значение, а это значит, что нет данных. – domlao

+0

@sasayins, это FD что-то вроде модема? Что именно вы опросили? –

4

дает вам событие, если есть данные/события для чтения/ошибки/когда вы можете писать.

Если вы получили сообщение о том, что «есть данные для чтения», и вы ничего не читаете, все равно будут «данные читать» при следующем вызове poll, и вы получите другое событие.

Смежные вопросы