2016-06-09 7 views
5

kqueue mechanism имеет флаг события, EV_RECEIPT, который, согласно связанному человеку странице:Что такое EV_RECEIPT от kqueue?

... полезно для массовых изменений в Kqueue без слива воды всех ожидающих событий. При передаче в качестве входного сигнала он всегда возвращает EV_ERROR. Когда фильтр успешно добавлен, поле данных будет равно нулю.

Моего понимание, однако, что это тривиально, чтобы сделать объемные изменения в Kqueue без слива воды всех ожидающих событий, просто передавая 0 для параметра nevents в kevent и, таким образом, не опираясь ни одного события из очереди. Имея это в виду, почему нужен EV_RECEIPT?

Некоторые sample code в компании Apple документации для OS X фактически использует EV_RECEIPT:

kq = kqueue(); 

EV_SET(&changes, gTargetPID, EVFILT_PROC, EV_ADD | EV_RECEIPT, NOTE_EXIT, 0, NULL); 
(void) kevent(kq, &changes, 1, &changes, 1, NULL); 

Но, видя, как changes массив никогда не исследовали после kevent вызова, это совершенно непонятно мне, почему EV_RECEIPT был использован в этом случае ,

Действительно ли EV_RECEIPT необходим? В какой ситуации это действительно было бы полезно?

ответ

2

Если вы делаете массовые изменения и один из них вызывает ошибку, то событие будет помещено в eventlist с EV_ERROR, установленными в flags и системной ошибке в data.

Поэтому возможно определить, какой элемент changelist вызвал ошибку.

Если вы установили nevents в ноль, вы получите код ошибки, но не указали, какое событие вызвало ошибку.

Таким образом, EV_RECEIPT позволяет установить nevents на ненулевое значение без выключения ожидающих событий.

+0

Хорошо, это имеет смысл, но оно не коррелирует с кодом в примере Apple, с которым я связан. Комментарий в этом коде говорит: _Создайте kqueue и настройте его для просмотра SIGCHLD. Используйте флаг new-in-10.5 EV_RECEIPT, чтобы гарантировать, что мы получим то, что ожидаем, - но оно вызывает 'kevent' только с одним событием, использует' EV_RECEIPT' и не проверяет ни возврат из 'kevent', ни значения в возвращать события. Любая подсказка относительно того, что означает комментарий, «мы получаем то, что ожидаем»? - или это использование 'EV_RECEIPT' в данном случае фиктивного? – davmac

+0

Я думаю, что в этом случае установка 'nevents' в ноль приведет к идентичному поведению, так как возвращаемое значение не будет проверено. Но это может быть шаблон, который реплицируется в другом коде, где проверено значение возврата *. Ожидается, что новый фильтр будет возвращен и * не * ожидающее событие. –