Механизм kqueue имеет флаг события EV_RECEIPT
, который, согласно связанной справочной странице:
... полезен для внесения массовых изменений в очередь без сброса ожидающих событий. При передаче в качестве входных данных он всегда возвращает
EV_ERROR
. При успешном добавлении фильтра поле данных будет равно нулю.
Насколько я понимаю, однако, тривиально вносить массовые изменения в kqueue, не удаляя какие-либо ожидающие события, просто передавая 0 для параметра nevents
в kevent
и, таким образом, не вытягивая события из очереди. Имея это в виду, почему EV_RECEIPT
необходимо?
Некоторый пример кода в документации 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? В какой ситуации это было бы действительно полезно?