Funktion in der Steckdosenprogrammierung auswählen

Lesezeit: 5 Minuten

Benutzer-Avatar
Benutzer484457

Kann mir jemand sagen, die Verwendung und Anwendung von select Funktion in der Socket-Programmierung in c?

  • Ich denke, Sie sollten Ihre Frage etwas spezifischer bearbeiten. Wenn Sie am Ende Ihrer Frage so viele Fragezeichen setzen, neigen die Leute dazu, die Frage nicht ernst zu nehmen.

    – Nico Huysamen

    13. November 2010 um 6:22 Uhr

Benutzer-Avatar
Ziffusion

Das select() Mit der Funktion können Sie ein ereignisgesteuertes Entwurfsmuster implementieren, wenn Sie mit mehreren Ereignisquellen umgehen müssen.

Angenommen, Sie möchten ein Programm schreiben, das auf Ereignisse aus mehreren Ereignisquellen reagiert, z. B. Netzwerk (über Sockets), Benutzereingaben (über stdin), andere Programme (über Pipes) oder jede andere Ereignisquelle, die durch ein dargestellt werden kann fd. Sie könnten separate Threads starten, um jede Ereignisquelle zu behandeln, aber Sie müssten die Threads verwalten und Parallelitätsprobleme behandeln. Die andere Option wäre die Verwendung eines Mechanismus, bei dem Sie alle aggregieren können fd zu einer einzigen Einheit fdsetund rufen Sie dann einfach eine Funktion auf, um auf die zu warten fdset. Diese Funktion würde immer dann zurückkehren, wenn ein Ereignis auf einem der auftritt fd. Du könntest prüfen welche fd das Ereignis ereignete sich am, lesen Sie das fd, das Ereignis verarbeiten und darauf reagieren. Nachdem Sie das getan haben, würden Sie zurückgehen und in dieser Wartefunktion sitzen – bis zu einem anderen Ereignis bei einigen fd ankommt.

select Anlage ist ein solcher Mechanismus, und die select() Funktion ist die Wartefunktion. Einzelheiten zur Verwendung finden Sie in zahlreichen Büchern und Online-Ressourcen.

  • Recht. select() ist ein Ereignis-Multiplexer.

    – Café

    16. November 2010 um 5:38 Uhr

  • Ich mag deine Erklärung, Ziffus. Ich fange gerade erst mit select an und habe einiges an Dokumentation im Internet gelesen, aber nichts kommt dem nahe.

    – Polichin

    24. Januar 2011 um 16:28 Uhr

  • Beste Erklärung Vielen Dank.

    – Vbp

    7. November 2013 um 4:27 Uhr

  • Ich habe dies vor einiger Zeit hochgeklickt, aber habe mich nach den Unterschieden zwischen der Verwendung umgesehen select() und poll() (und Familie). Mir kam der Gedanke, dass, wenn Sie die Zeit und Lust hätten, ein kurzer Absatz, der die Unterschiede zwischen den beiden Methoden auflistet, hier hervorragend passen und Ihre Antwort (bereits gut gemacht.) Noch interessanter und nützlicher machen würde. Insbesondere wäre es interessant, wenn Sie eventuelle Features beschreiben könnten, die das machen select() lieber vorbei poll() für eine bestimmte Anwendung. (Die meisten Beiträge, die ich bisher gelesen habe, sind dafür poll().

    – ryker

    28. Februar 2019 um 15:00 Uhr


  • Also, nur um klar zu sein, fd steht für “Dateideskriptor”?

    – djvg

    23. Dezember 2020 um 12:39 Uhr


Benutzer-Avatar
Talia

Das select Mit der Funktion können Sie mehrere verschiedene Sockets oder Pipes (oder überhaupt beliebige Dateideskriptoren, wenn Sie nicht unter Windows arbeiten) überprüfen und etwas tun, je nachdem, was zuerst bereit ist. Genauer gesagt, die Argumente für die select Funktion werden in drei Gruppen eingeteilt:

  • Lektüre: Wenn einer der Dateideskriptoren in dieser Kategorie zum Lesen bereit ist, gibt select sie an Sie zurück.

  • Schreiben: Wenn einer der Dateideskriptoren in dieser Kategorie zum Schreiben bereit ist, gibt select sie an Sie zurück.

  • Außergewöhnlich: Wenn einer der Dateideskriptoren in dieser Kategorie einen Ausnahmefall hat – das heißt, sie werden unsauber geschlossen, eine Verbindung bricht ab oder sie haben einen anderen Fehler – select werde sie dir zurückgeben.

Die kraft von select ist, dass einzelne Datei-/Socket-/Pipe-Funktionen oft blockieren. Select ermöglicht es Ihnen, die Aktivität mehrerer verschiedener Dateideskriptoren zu überwachen, ohne dass Sie für jeden Funktionsaufruf einen eigenen Thread Ihres Programms haben müssen.

Damit Sie eine genauere Antwort erhalten, müssen Sie wahrscheinlich angeben, in welcher Sprache Sie programmieren. Ich habe versucht, eine möglichst allgemeine Antwort auf konzeptioneller Ebene zu geben.

select() ist die Low-Tech-Methode zum Abfragen von Sockets, um neue Daten zu lesen oder ein offenes TCP-Fenster zu schreiben. Sofern es keinen zwingenden Grund gibt, dies nicht zu tun, sind Sie wahrscheinlich besser dran, poll() oder epoll_wait() zu verwenden, wenn Ihre Plattform es hat, um eine bessere Leistung zu erzielen.

Benutzer-Avatar
fett

Ich mag Beschreibung an gnu.org:

Manchmal muss ein Programm Eingaben auf mehreren Eingabekanälen akzeptieren, wann immer eine Eingabe ankommt. Einige Workstations können beispielsweise Geräte wie ein Digitalisierungstablett, eine Funktionstastenbox oder eine Wählbox haben, die über normale asynchrone serielle Schnittstellen verbunden sind; Ein guter Stil der Benutzeroberfläche erfordert, dass auf Eingaben auf jedem Gerät sofort reagiert wird. […]

Sie können normalerweise nicht verwenden read zu diesem Zweck, da dies das Programm blockiert, bis eine Eingabe für einen bestimmten Dateideskriptor verfügbar ist; Eingang auf anderen Kanälen wird es nicht aufwecken. Sie könnten den Nonblocking-Modus einstellen und jeden Dateideskriptor der Reihe nach abfragen, aber das ist sehr ineffizient.

Eine bessere Lösung ist die Verwendung von select Funktion. Dadurch wird das Programm blockiert, bis die Eingabe oder Ausgabe für einen bestimmten Satz von Dateideskriptoren bereit ist oder bis ein Timer abläuft, je nachdem, was zuerst eintritt.

Benutzer-Avatar
Steve-o

Gemäß der Dokumentation für Linux-Manpages und MSDN für Windows,

select() und pselect() ermöglichen es einem Programm, mehrere Dateideskriptoren zu überwachen und zu warten, bis einer oder mehrere der Dateideskriptoren für eine Klasse von E/A-Operationen “bereit” werden (z. B. Eingabe möglich). Ein Dateideskriptor gilt als bereit, wenn es möglich ist, die entsprechende I/O-Operation (z. B. read(2)) ohne Blockierung durchzuführen.

Zur einfachen Erklärung: Oft ist es für eine Anwendung erforderlich, mehrere Dinge gleichzeitig zu tun. Beispielsweise können Sie in einem Webbrowser auf mehrere Websites zugreifen, ein Webserver möchte möglicherweise mehrere Clients gleichzeitig bedienen. Man braucht einen Mechanismus, um jeden Socket zu überwachen, damit die Anwendung nicht damit beschäftigt ist, auf den Abschluss einer Kommunikation zu warten.

Ein Beispiel: Stellen Sie sich vor, Sie laden während einer Zugfahrt eine große Facebook-Seite auf Ihr Smartphone herunter. Ihre Verbindung ist intermittierend und langsam, der Webserver sollte in der Lage sein, andere Clients zu verarbeiten, während er auf das Ende Ihrer Kommunikation wartet.

1226550cookie-checkFunktion in der Steckdosenprogrammierung auswählen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy