Sul lato kernel è facile evitare di utilizzare l'interfaccia sys_epoll()
a titolo definitivo. Dopo tutto, hai un accesso diretto agli oggetti del kernel, non c'è bisogno di saltare attraverso i cerchi.
Ogni oggetto file
, zoccoli inclusi, "sostituisce" un metodo di polling nel suo "vtable" file_operations
. Puoi semplicemente aggirare tutti i tuoi socket, chiamando lo ->poll()
su ognuno di essi e producendo periodicamente o quando non ci sono dati disponibili.
Se le prese sono abbastanza trafficate, non è necessario altro.
Una nota sul API:
poll()
metodo richiede un argomento poll_table()
, se non avete intenzione di aspettare su di esso, si può tranquillamente essere inizializzato a null:
poll_table pt;
init_poll_funcptr(&pt, NULL);
...
// struct socket *sk;
...
unsigned event_mask = sk->ops->poll(sk->file, sk, &pt);
Se vuoi aspettare, basta giocare con il callback impostato su poll_table
per init_poll_funcptr()
.
Non so se hai già visitato questo link http://stackoverflow.com/questions/11336034/simulate-effect-of-select-and-poll-in-kernel-socket-programming – askb
@askb Pubblica commento come risposta e lo accetterò. – dimba
è ora aggiornato. – askb