2014-12-02 17 views
8

Ho un driver che gestisce diverse connessioni TCP.Utilizzo di select()/poll() nel driver di dispositivo

C'è un modo per eseguire qualcosa di simile all'applicazione dello spazio utente select/poll()/epoll() nel kernel dato un elenco di struct sock?

Grazie

+3

Non so se hai già visitato questo link http://stackoverflow.com/questions/11336034/simulate-effect-of-select-and-poll-in-kernel-socket-programming – askb

+0

@askb Pubblica commento come risposta e lo accetterò. – dimba

+0

è ora aggiornato. – askb

risposta

2

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().

Problemi correlati