2016-06-09 10 views
5

Il kqueue mechanism ha una bandiera della manifestazione, EV_RECEIPT, che secondo la pagina di uomo legato:Per cosa è esattamente EV_RECEIPT di kqueue?

... è utile per effettuare modifiche collettive a un kqueue senza scaricare alcun evento in sospeso. Quando passato come input, obbliga a restituire sempre EV_ERROR. Quando un filtro è aggiunto correttamente, il campo dati sarà zero.

mia comprensione, tuttavia, è che è banale per apportare modifiche collettive ad un kqueue senza scaricare tutti gli eventi in corso, semplicemente passando 0 per il parametro nevents per kevent e utilizzando così eventi dalla coda. Con questo in mente, perché è necessario il numero EV_RECEIPT?

Alcuni sample code nella documentazione di Apple per OS X utilizza effettivamente 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); 

Ma, visto che la matrice changes non è mai esaminata dopo la chiamata kevent, è totalmente chiaro per me perché EV_RECEIPT è stato utilizzato in questo caso .

È EV_RECEIPT effettivamente necessario? In che situazione sarebbe davvero utile?

risposta

2

se si stanno facendo modifiche collettive e una di esse fa un errore, allora l'evento sarà inserito nella eventlist con EV_ERROR impostato nel flags e l'errore di sistema in data.

Pertanto è possibile identificare quale elemento changelist ha causato l'errore.

Se si imposta nevents a zero, si ottiene il codice di errore ma nessuna indicazione di quale evento ha causato l'errore.

Quindi EV_RECEIPT consente di impostare nevents su un valore diverso da zero senza scaricare alcun evento in sospeso.

+0

Ok, questo ha senso, ma non è correlato con il codice nell'esempio Apple che ho collegato. Il commento in questo codice dice: _Crea il kqueue e impostalo per guardare SIGCHLD. Usa il flag new-in-10.5 EV_RECEIPT per assicurarci di ottenere ciò che ci aspettiamo_ - tuttavia, chiama 'kevent' con un solo evento, usa' EV_RECEIPT', e non verifica né il ritorno da 'kevent' né i valori nel ritorna eventi. Qualche indizio su cosa significhi il commento con "otteniamo ciò che ci aspettiamo"? - o è l'uso di 'EV_RECEIPT' in questo caso fasullo? – davmac

+0

Penso che in questo caso, l'impostazione di 'nevents' su zero otterrebbe un comportamento identico, in quanto il valore restituito non viene controllato. Ma questo può essere un pattern che viene replicato in un altro codice in cui il valore di ritorno * è * controllato. L'aspettativa è che il nuovo filtro viene restituito e * non * un evento in sospeso. –

Problemi correlati