2016-06-09 18 views
5

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?

Odpowiedz

2

Jeśli dokonujesz zmian zbiorczych i jeden z nich powoduje błąd, to zdarzenie zostanie umieszczony w eventlist z EV_ERROR ustawionym w flags i błędem systemowym w data.

Dzięki temu można zidentyfikować, który element changelist spowodował błąd.

Jeśli ustawisz nevents na zero, otrzymasz kod błędu, ale brak wskazania, które zdarzenie spowodowało błąd.

Tak więc EV_RECEIPT pozwala ustawić nevents na niezerową wartość bez opróżniania żadnych oczekujących zdarzeń.

+0

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

+0

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. –