kqueue mechanism ma flagę zdarzenia, EV_RECEIPT
, która według strony połączonej Man:Czym dokładnie jest EV_RECEIPT kqueue?
... jest przydatny do dokonywania zmian zbiorczych do KQUEUE bez opróżniania oczekujących zdarzeń. Po przekazaniu jako dane wejściowe, wymusza zawsze zwracanie wartości
EV_ERROR
. Po dodaniu filtru pole danych będzie wynosić zero. jednak
moim rozumieniu jest to, że jest trywialny do masowych zmian w KQUEUE bez opróżniania oczekujących zdarzeń, po prostu przechodząc 0 dla parametru nevents
do kevent
a więc rysunek nr zdarzenia z kolejki. Mając to na uwadze, dlaczego konieczna jest EV_RECEIPT
?
Niektóre sample code w dokumentacji firmy Apple dla OS X faktycznie korzysta 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);
Ale widząc, jak tablica changes
nigdy nie jest badany po wywołaniu kevent
, jest to całkowicie dla mnie jasne, dlaczego EV_RECEIPT
użyto w tym przypadku .
Czy EV_RECEIPT jest rzeczywiście potrzebny? W jakiej sytuacji byłoby to naprawdę przydatne?
OK, ma to sens, ale nie koreluje z kodem w przykładzie Apple, który został przeze mnie połączony. Komentarz w tym kodzie mówi: _Utwórz kino i ustaw, aby oglądać SIGCHLD. Użyj flagi new-in-10.5 EV_RECEIPT, aby upewnić się, że otrzymujemy to, czego oczekujemy_ - jednak wywołuje 'kevent' za pomocą tylko jednego zdarzenia, używa' EV_RECEIPT' i nie sprawdza ani powrotu z 'kevent' ani wartości w wydarzenia powrotne. Jakąkolwiek wskazówkę dotyczącą tego, co oznacza komentarz, "dostajemy to, czego oczekujemy"? - lub czy użycie "EV_RECEIPT" w tym przypadku jest fałszywe? – davmac
Myślę, że w tym przypadku ustawienie "nieważkości" na zero zapewni identyczne zachowanie, ponieważ wartość zwracana nie jest sprawdzana. Ale może to być wzorzec, który jest replikowany w innym kodzie, w którym zwracana jest wartość * *. Oczekuje się, że nowy filtr zostanie zwrócony i * nie * oczekuje na wydarzenie. –