C-Programmierung

So verwenden Sie Select System Call in C

So verwenden Sie Select System Call in C
Der Systemaufruf select() ermöglicht es einem System, mehrere Dateideskriptoren zu verfolgen. Der Systemaufruf select wartet also darauf, dass sich einer der Deskriptoren oder ein Ganzes als „bereit“ für eine bestimmte Art von E/A-Aktivität (z.G., Eingabe möglich). Wenn der nachfolgende I/O-Prozess (z.G., read(2)) trotz Blockierung ausgeführt werden kann, gilt der Dateideskriptor als fähig. Die Methode select() beschreibt, ob ein Dokumentdeskriptor zum Lesen verfügbar, zum Schreiben vorbereitet oder in einem Ausnahmezustand ist. Angenommen, die angegebene Situation ist für alle angegebenen Dateideskriptoren falsch. In diesem Fall sind die select()-Systemaufrufblöcke vor den genannten Umständen für mindestens einen der angegebenen Dokumentdeskriptoren gültig, die dem angegebenen Timeout-Intervall entsprechen.

Beispiel für Systemruf auswählen:

Lassen Sie uns ein einfaches Beispiel haben, um die Funktionsweise von Select System Call zu überprüfen. Öffnen Sie die Kommandozeilen-Shell mit „Strg+Alt+T.” Stellen Sie nach dem Öffnen des Terminals sicher, dass auf Ihrem System ein C-Compiler installiert ist, da der Code ohne ihn nicht funktioniert. Wenn Sie keinen haben, probieren Sie den folgenden Befehl aus, um dies zu tun.

$ sudo apt install gcc

Wenn Sie möchten, dass der Linux-Select-Systemaufruf funktioniert, muss das manpages-dev-Paket gemäß dem folgenden Befehl auf Ihrem System installiert sein. Schreiben Sie Ihr Benutzerpasswort, um fortzufahren.

$ sudo apt install manpages-dev

Sie können die Syntax und Funktionsweise des Systemaufrufs auswählen mit dem folgenden Befehl "man" sehen.

$ Mann 2 auswählen

Die Ausgabe-Manpage für den select-Systemaufruf wird unten angezeigt. Beenden Sie es durch Drücken der Taste „q“.

Standardverzeichnisse, Command-Shell-Terminal- und Pseudo-Terminal-Anwendungen, STREAMS-zentrierte Dokumente, FIFOs, einschließlich Pipes, werden alle vom select()-Modul unterstützt. Die Aktivität von select() auf Dokumentdeskriptoren, die sich auf diese anderen Dateiformate beziehen, ist unbekannt. Nachfolgend finden Sie die Erklärung des Systemaufrufs Select.

Die Beschreibung der im obigen Bild gezeigten Syntax ist unten beschrieben.

Oben ist die Bibliothek, die in den C-Code aufgenommen werden soll, während der Select-Systemaufruf verwendet wird. Wenn es nicht enthalten ist, funktioniert der Code nicht.

Das nfds -Anweisung definiert den Dateideskriptorsatz, der ausgewertet wird. Die Methode select() überprüft Dateideskriptoren zwischen 0 und nfds-1.

Während readfds nicht null ist, bezieht es sich auf ein Array der Form fd_set, das definiert, welche Dokumentdeskriptoren auf ihre Lesebereitschaft bei der Eingabe getestet werden sollen und welche Dokumentdeskriptoren alle auf das Lesen bei der Ausgabe eingestellt werden sollen.

Wenn der schreibfds Parameter ist nicht leer, er bezieht sich auf eine Entität der Form fd_set, die definiert, welche Dokumentdeskriptoren auf ihre Eingabebereitschaft getestet werden sollen. Die Dokumentdeskriptoren sollten so vorbereitet sein, dass sie bei der Ausgabe erstellt werden können.

Während errorfds Parameter ist nicht leer, er bezieht sich auf ein Objekt vom Typ fd_set, das bestimmt, welche Dokumentdeskriptoren auf Fehler bei der Eingabe getestet werden sollen; Außerdem sollten die Dokumentdeskriptoren bei der Ausgabe überprüft werden.

Die Parameter readfds, writefds und errorfds werden nach der Ausführung aktualisiert, um anzuzeigen, dass Dokumentdeskriptoren zum Lesen vorbereitet, vollständig zum Schreiben vorbereitet sind oder sogar einen Exception-Zustand erwartend haben. Wenn das Folgebit bei der Eingabe fixiert ist und die relevante Situation für jeden Dateideskriptor etwas unterhalb von nfds gültig ist, würde das Folgebit auf effektive Ausführung gesetzt.

Während der Parameter timeout nicht wirklich leer ist, führt er zu einer Struktur-Zeitwert-Entität, die die höchste Zeit bestimmt, um Ihr Feuer zu halten, bis die Wahl abgeschlossen ist. Select() behindert nicht ganz, wenn ein solcher Timeout-Parameter zu einem Struktur-Timeval-Objekt mit 0 Elementen führt. Select() stoppt, es sei denn, ein Vorkommen erlaubt es, einen der Filter mit einem wahren Ergebnis (nicht null) abzurufen, unabhängig davon, ob die Timeout-Anweisung eine leere Referenz ist. Select() ist effektiv erfolgreich und erzeugt 0, wenn die Wartezeit endet, noch bevor das Ereignis eintritt, was möglicherweise eine Anpassung einer von mehreren Masken auf einen Wert ungleich Null erforderlich macht.

Dieses Makro entfernt die Sammlung (löscht alle Dokumentdeskriptoren). Es kann als allererster Schritt bei der Initialisierung einer Dokumentdeskriptorsammlung verwendet werden.

Der Dokumentdeskriptor fd wird durch dieses Makro zur Sammlung hinzugefügt. Die Verwendung eines Dokumentdeskriptors für eine bereits vorhandene Sammlung wäre nicht betriebsbereit und führt daher nicht zu einem Ausnahmefehler.

Der Dokumentdeskriptor fd wird durch dieses Makro aus der Sammlung entfernt. Ein nicht vorhandener Dateideskriptor, der aus der Sammlung entfernt wurde, ist nicht funktionsfähig und führt daher nicht zu einer Ausnahme.

Der Systemaufruf select() ändert die Informationen oder Daten der Sammlungen gemäß den oben genannten Regeln. Das Makro FD ISSET() kann durch Aufrufen von select() deaktiviert werden, um zu sehen, ob ein Dokumentdeskriptor in einer Sammlung verfügbar bleibt.

Lassen Sie uns eine neue Datei vom Typ C mit dem Namen "new" erstellen.c” wie unten.

$ nano neu.c

Der GNU-Editor wurde geöffnet. Schreibe den darunter liegenden Code hinein. Der Code enthält Header, Hauptfunktion mit einigen Dateideskriptoren wie oben beschrieben elaborate. Es enthält auch eine Struktur für den Zeitintervallwert. Dann haben wir den select-Systemaufruf verwendet, um den Fehler in der „if“-Anweisung zu überprüfen. Drücken Sie „Strg+S“, um diesen Code zu speichern und „Strg+X“, um den Editor zu verlassen.

Kompilieren Sie nun den Code mit der Anweisung „gcc“.

$ gcc neu.c

Führen Sie den Code aus und fügen Sie keine Eingaben hinzu. Die Ausgabe lautet "Zeitüberschreitung auswählen".”

$ ./ein.aus

Führen Sie den Code erneut aus und geben Sie einige Eingaben im Terminal ein, z.G., “Aqsa.“ Es wird ausgegeben, dass die „Daten sind verfügbar“.”

Fazit:

Wir haben den Select System Call auf dem Ubuntu 20 . implementiert.04 Linux-System. Der Code sollte auf allen Linux-Distributionen gleich und richtig funktionieren. Ich hoffe, Sie finden diesen Artikel leicht zu implementieren und zu verstehen.

Kostenlose und Open-Source-Spiele-Engines für die Entwicklung von Linux-Spielen
Dieser Artikel behandelt eine Liste von kostenlosen und Open-Source-Spiele-Engines, die für die Entwicklung von 2D- und 3D-Spielen unter Linux verwend...
Shadow of the Tomb Raider für Linux Tutorial
Shadow of the Tomb Raider ist die zwölfte Erweiterung der Tomb Raider-Reihe – ein Action-Adventure-Franchise von Eidos Montrealdos. Das Spiel wurde vo...
So steigern Sie die FPS unter Linux?
FPS steht für Bilder pro Sekunde. Die Aufgabe von FPS besteht darin, die Bildrate bei Videowiedergaben oder Spielleistungen zu messen. In einfachen Wo...