Quando un evento è registrato con kqueue
un ID relativo a tale evento tipo è fornito; per esempio un descrittore di file viene utilizzato per identificare un file di guardareUsa kqueue di rispondere a più di un tipo di evento
int kq;
struct kevent ke;
kq = kqueue();
fd = open(argv[1], O_RDONLY);
EV_SET(&ke, fd, EVFILT_VNODE, EV_ADD, NOTE_DELETE | NOTE_RENAME, 0, NULL);
kevent(kq, &ke, 1, NULL, 0, NULL);
while (1) {
kevent(kq, NULL, 0, &ke, 1, NULL);
/* respond to file system event */
}
Ora, se ho anche bisogno di rispondere ad altri tipi di eventi tali segnali abbiamo bisogno di una nuova istanza di kqueue in modo da evitare un conflitto con il ident
argomento di kevent()
.
kq_sig = kqueue();
struct kevent ke_sig;
/* set the handler and ignore SIGINT */
signal(SIGINT, SIG_IGN);
EV_SET(&ke_sig, SIGINT, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);
kevent(kq_sig, &ke_sig, 1, NULL, 0, NULL);
while (1) {
kevent(kq_sig, NULL, 0, &ke_sig, 1, NULL);
/* respond signals */
}
All'uscita più di un tipo di evento sembra richiedere più thread che agiscono sul stato condiviso (ricevente un segnale potrebbe chiudere un descrittore di file per esempio).
Esiste un meccanismo più generale per l'invio di un messaggio da un thread ad un altro utilizzando kqueue? In alcuni casi, posso immaginare di abilitare e disabilitare un filtro come mezzo di triggerare un altro kevent.
Ma non è l'unico ID, in modo che si possono mescolare diversi tipi di eventi nello stesso evento q? O ho sbagliato la tua domanda? – dhein
Esattamente a destra; l'ID deve essere univoco perché la struttura di kevent non memorizza il tipo di evento. Rispondere a un tipo di evento è molto semplice ciclo che file di KEVENT(), ma la gestione di più tipi di evento (vnode & SIGNAL nell'esempio) è considerevolmente più difficile perché un certo coordinamento tra le filettature (o processi) sembra essere richiesta. – eradman
Hm, allora io sono fuori mi dispiace ... ma avrò bisogno di questo nel futur troppo .... ho solo pensato ci non sarà alcun troubble in più thread o processi, perché l'ID è unico nel sistema gamma. Ma seguirò questo. – dhein