2016-06-09 6 views
5

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?

Antwort

2

Wenn Sie Bulk-Änderungen vornehmen, und einer von ihnen einen Fehler verursacht, dann wird das Ereignis in den eventlist mit EV_ERROR gesetzt in flags und dem Systemfehler in data platziert werden.

Daher ist es möglich zu identifizieren, welche changelist Element den Fehler verursacht hat.

Wenn Sie nevents auf Null setzen, erhalten Sie den Fehlercode, aber keine Angabe, welches Ereignis den Fehler verursacht hat.

Mit EV_RECEIPT können Sie also nevents auf einen Wert ungleich Null setzen, ohne ausstehende Ereignisse zu löschen.

+0

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

+0

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