Die kqueue mechanism hat ein Ereignis Flagge, EV_RECEIPT
, die zu der verknüpften Manpage nach:Für was genau ist kqueues EV_RECEIPT?
... ist nützlich für die Herstellung von Bulk-Änderungen an einem kqueue ohne alle anstehenden Ereignisse abzulassen. Wenn es als Eingabe übergeben wird, erzwingt es
EV_ERROR
immer zurückgegeben werden. Wenn ein Filter erfolgreich hinzugefügt wurde, ist das Datenfeld Null.
Mein Verständnis ist jedoch, dass es trivial ist Bulk-Änderungen an einen kqueue zu machen, ohne alle anstehenden Ereignisse zu Entleeren einfach durch 0 für die nevents
Parameter kevent
vorbei und somit keine Ereignisse aus der Warteschlange zu ziehen. In diesem Sinne, warum ist EV_RECEIPT
notwendig?
Einige sample code in Apple-Dokumentation für OS X verwendet tatsächlich 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);
Aber sehen, wie die changes
Array nach dem kevent
Anruf nie untersucht, es ist völlig unklar mir warum EV_RECEIPT
in diesem Fall verwendet wurde, .
Ist EV_RECEIPT tatsächlich notwendig? In welcher Situation wäre es wirklich nützlich?
Ok, das macht Sinn, aber es korreliert nicht mit dem Code im Apple-Beispiel, das ich verlinkt habe. Der Kommentar in diesem Code sagt: _ Erstellen Sie die Kqueue und richten Sie sie ein, um nach SIGCHLD zu suchen. Verwenden Sie das new-in-10.5 EV_RECEIPT-Flag, um sicherzustellen, dass wir das bekommen, was wir erwarten _ - es ruft jedoch 'kevent' mit nur einem einzigen Ereignis auf, verwendet' EV_RECEIPT' und überprüft weder die Rückgabe von 'kevent' noch die Werte in Ereignisse zurückgeben Irgendwelche Hinweise darauf, was der Kommentar mit "wir bekommen, was wir erwarten" bedeutet? - Oder ist die Verwendung von "EV_RECEIPT" in diesem Fall falsch? – davmac
Ich denke in diesem Fall würde das Setzen von 'nevents' auf Null zu einem identischen Verhalten führen, da der Rückgabewert nicht überprüft wird. Dies kann jedoch ein Muster sein, das in anderem Code repliziert wird, in dem der Rückgabewert * überprüft wird. Die Erwartung ist, dass der neue Filter zurückgegeben wird, und * kein * ausstehendes Ereignis. –