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
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
Möglicherweise möchten Sie Ihre eigenen sk_buff
Handler schreiben, die die kernel_select()
aufruft, die die Semaphore zu sperren versucht und hat eine Blockierung warten, wenn der Socket geöffnet ist.
Nicht sicher, ob Sie bereits über diesen Link Simulate effect of select()
and poll()
in kernel socket programming
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.
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
@askb Posten Sie kommentieren als Antwort und ich werde es akzeptieren. – dimba
ist jetzt aktualisiert. – askb