2014-12-02 14 views
8

Ich habe einen Treiber, der mehrere TCP-Verbindungen behandelt.Mit Auswahl()/Poll() im Gerätetreiber

Gibt es eine Möglichkeit, etwas ähnliches wie User Space-Anwendung api die Auswahl/Poll()/epoll() im Kernel eine Liste von struct sock 's?

Dank

+3

Nicht sicher, ob Sie diesen Link bereits durchlaufen haben http://stackoverflow.com/questions/11336034/simulate-effect-of-select-and-poll-in-kernel-socket-programming – askb

+0

@askb Posten Sie kommentieren als Antwort und ich werde es akzeptieren. – dimba

+0

ist jetzt aktualisiert. – askb

Antwort

2

Auf der Kernel-Seite gegangen sind, ist es einfach, geradezu mit sys_epoll() Schnittstelle zu vermeiden. Schließlich haben Sie direkten Zugriff auf Kernel-Objekte und müssen nicht durch die Ringe springen.

Jedes file Objekt, Sockets enthalten, "überschreibt" eine Poll-Methode in seiner file_operations "vtable". Sie können einfach alle Ihre Sockets umschlingen, indem Sie auf jedem von ihnen ->poll() aufrufen und regelmäßig oder wenn keine Daten verfügbar sind.

Wenn die Sockets ziemlich viel Verkehr sind, brauchen Sie nichts mehr als das.

Ein Hinweis auf die API: Wenn

poll_table pt; 
init_poll_funcptr(&pt, NULL); 
... 
// struct socket *sk; 
... 
unsigned event_mask = sk->ops->poll(sk->file, sk, &pt); 

:

poll() Methode erfordert eine poll_table() Argument, aber wenn Sie darauf nicht warten möchten, kann es sicher auf null initialisiert werden Sie möchten warten, spielen Sie einfach mit dem in poll_table von init_poll_funcptr() eingestellten Rückruf.

Verwandte Themen