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 необходим? В какой ситуации это действительно было бы полезно?
Хорошо, это имеет смысл, но оно не коррелирует с кодом в примере Apple, с которым я связан. Комментарий в этом коде говорит: _Создайте kqueue и настройте его для просмотра SIGCHLD. Используйте флаг new-in-10.5 EV_RECEIPT, чтобы гарантировать, что мы получим то, что ожидаем, - но оно вызывает 'kevent' только с одним событием, использует' EV_RECEIPT' и не проверяет ни возврат из 'kevent', ни значения в возвращать события. Любая подсказка относительно того, что означает комментарий, «мы получаем то, что ожидаем»? - или это использование 'EV_RECEIPT' в данном случае фиктивного? – davmac
Я думаю, что в этом случае установка 'nevents' в ноль приведет к идентичному поведению, так как возвращаемое значение не будет проверено. Но это может быть шаблон, который реплицируется в другом коде, где проверено значение возврата *. Ожидается, что новый фильтр будет возвращен и * не * ожидающее событие. –