Mit select () / poll () im Gerätetreiber

8

Ich habe einen Treiber, der mehrere TCP-Verbindungen behandelt.

Gibt es eine Möglichkeit, etwas Ähnliches zu tun, das der Benutzerraum-Anwendung api select / poll () / epoll () im Kernel bei einer Liste von struct sock 's?

entspricht?

Danke

    
dimba 02.12.2014, 12:28
quelle

2 Antworten

6

Vielleicht möchten Sie Ihren eigenen benutzerdefinierten sk_buff -Handler schreiben, der den kernel_select() aufruft, der versucht, den Semaphor zu sperren, und eine Blockierung wartet, wenn der Socket geöffnet ist.

Nicht sicher, ob Sie diesen Link bereits durchlaufen haben Simulieren Sie den Effekt von select() und poll() in der Kernel-Socket-Programmierung

    
askb 11.12.2014, 14:03
quelle
2

Auf der Kernel-Seite ist es leicht zu vermeiden, sys_epoll() interface outright zu verwenden. Schließlich haben Sie direkten Zugriff auf Kernel-Objekte, ohne durch die Ringe springen zu müssen.

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

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

Eine Anmerkung zur API:

Die Methode

poll() erfordert ein Argument poll_table() . Wenn Sie jedoch nicht darauf warten möchten, kann sie mit null initialisiert werden:

%Vor%

Wenn Sie warten möchten, spielen Sie einfach mit dem Callback in poll_table by init_poll_funcptr() .

    
oakad 11.12.2014 14:42
quelle

Tags und Links