C-Programmierung

So verwenden Sie Poll System Call in C

So verwenden Sie Poll System Call in C
Die Funktion poll() ermöglicht es Programmen, Eingaben und Ausgaben durch eine Reihe von Dateideskriptoren zu multiplexen. Mit anderen Worten, der Systemaufruf poll() funktioniert analog zum Systemaufruf select(), da er sein Feuer für einen von mehreren Dateideskriptoren hält, indem er für I/O verfügbar wird. Poll() untersucht den zugewiesenen Dokumentdeskriptor, um die Ereignisse in Vorfällen zu jedem Element des Arrays aufzulisten, das durch Dateideskriptoren darauf zeigt. Die Methode poll() kann bestimmen, in welchen der Dateideskriptoren ein Programm Details lesen oder schreiben wird, die diese Vorfälle gesehen haben. In diesem Handbuch verwenden wir Ubuntu 20.04, um das Konzept des poll()-Systemaufrufs unter Linux Schritt für Schritt zu verstehen.

Syntax:

int poll(struct pollfd *ufds, unsigned int nfds, int timeout);

Das Argument „fds“ bestimmt die zu prüfenden Dokumentdeskriptoren sowie die jeweils bedeutsamen Vorfälle. Es ist ein Verweis auf entweder ein Array, das ein Element für jeden geöffneten Dokumentdeskriptor hat. Die Elemente des Arrays sind pollfd-Strukturen, wobei fd einen offenen Dokumentdeskriptor bezeichnet, und alle Ereignisse und Re-Ereignisse, die normalerweise als Bitmasken bezeichnet werden, werden durch eine Kombination der entsprechenden Ereignis-Flags generiert:

POLLIN:

Neben Daten mit hoher Priorität können auch Informationsdaten ohne Sperrung ausgelesen werden. Auch wenn die Antwortnachricht keine Größe hat, wird dieses Flag-Signal für die STREAMS in revents erzeugt. Dieses Flag hat die gleiche Bedeutung wie POLLRDNORM | POLLRDBAND.

POLLRDNORM:

Ohne Unterbrechung können gewöhnliche Informationsdaten ausgelesen werden. Informationen zur Primärpriorität betreffen Band 0 können trotz Unterbrechung für STREAMS gelesen werden. Und wenn die Antwortnachricht die Länge Null hat, wird dieses Signal bei erneuten Ereignissen generiert.

POLLRDBAND:

Primäre Anliegendaten werden trotz eventueller Verzögerungen ausgelesen. Informationen zu Prioritätsbereichen größer Null können trotz Eingriff in STREAMS . gelesen werden. Und wenn die Nachrichtenantwort von null Dauer ist, wird dieses Signal in Revents verbreitet.

POLLPRI:

Es kann einige Ausnahmen vom Dokumentdeskriptor geben. Informationen mit höchster Priorität können ohne Sperre gelesen werden. Auch wenn die Antwort eine Dauer von null ist, wird dieses Signal für STREAMS in revents ausgebreitet.

UMFRAGE:

Benutzer können mit dem POLLOUT-Flag ausschreiben. Ohne Anhalten können typische Daten aufgezeichnet werden. Informationen zum Präferenzband 0 können trotz Unterbrechung in STREAMS aufgezeichnet werden.

UMFRAGEWRNORM:

Es funktioniert genauso wie POLLOUT.

POLLWRBAND:

Die Daten mit der höchsten Priorität werden mit diesem Flag geschrieben. Informationen über Präferenzbereiche größer Null für STREAMS können ohne Sperrung erfasst werden. Diese Aktivität wertet nur Bänder aus, die bereits mindestens einmal beschrieben wurden, da in diesem STREAM kein Präferenzband geschrieben wurde.

POLLER:

Dies ist ein Fehlerzustand und tritt nur auf, wenn das System oder der Flow auf ein Problem gestoßen ist. Dieses Symbol gilt nur für die revents-Bitmaske; während des gesamten Aktivitätenteilnehmers wird es übersehen.

UMFRAGE:

Es gibt die Auflegebedingung an und tritt nur auf, wenn die Verbindung zum System deaktiviert wurde. Dieses Auftreten und POLLOUT sind gleichermaßen kompatibel; Sobald ein Problem aufgetreten ist, wird nie ein Stream geschrieben.

UMFRAGE:

Dies gibt die ungültige oder ungewöhnliche Anfrage an. Diese Aktivität schließt jedoch die Teilnahme an POLLIN, POLLRDNORM, POLLRDBAND oder POLLPRI . nicht aus. Dieses Symbol gilt nur für die revents-Bitmaske; es wird beim Teilnehmer der Veranstaltung übersehen.

Beispiel für einen Systemaufruf abfragen:

Es erfüllt die gleiche Rolle wie select(), allerdings in einem größeren Maßstab. Poll() ist auf jedem Glibc-basierten Linux-Rechner verfügbar. Die älteren Kernel imitieren poll() mit select() in der gesamten C-Bibliothek. Programme sollten jedoch keinen Unterschied machen müssen. Hier ist ein Beispiel dafür, wie sich poll() anfühlt. Öffnen Sie also zuerst das Kommandozeilen-Terminal mit der Tastenkombination „Strg+Alt+T.” Nach dem Öffnen müssen wir eine C-Typ-Datei erstellen, um einen C-Typ-Code darin zu schreiben. Dafür haben wir den Nano-Editor verwendet. Probieren Sie also den folgenden nano-Befehl im Terminal zusammen mit dem Namen der C-Datei aus.

$ nano neu.c

Nun ist der Nano-Editor für die C-Datei „neu“ geöffnet. Sie müssen zuerst einige Bibliotheken einbinden, insbesondere die „Umfrage“.h” Bibliothek. Die Hauptfunktion wurde mit einem ganzzahligen Rückgabetyp mit zwei Argumenten in ihrem Parameter angegeben, z.G., argc und argv. Dann haben wir einen Dateideskriptor fd und ein Zeichentyp-Array namens „buf“ deklariert.” Danach wurde eine Variable vom Strukturtyp namens pollfd pfds der Größe 2 definiert. Als nächstes wurde ein offener Systemaufruf deklariert, um den Wert aus dem Zeichentyp-Array zu erhalten und ihn dem Dateideskriptor „fd“ zuzuweisen, wie im Bild zu sehen. Während der Dateideskriptor "1" ist, wird die Struktur "pfds" mit einigen darin enthaltenen Daten aktualisiert, indem das POLLIN-Flag darin verwendet wird. Jetzt haben wir eine poll()-Systemaufruffunktion definiert. Der erste Parameter des poll()-Systemaufrufs ist die im Code verwendete ufds-Struktur. Der zweite Parameter gibt die Summe der pollfd-Strukturen in der fds-Serie an.

Und der letzte Parameter zeigt den Timeout-Wert vom Typ Integer für den Poll-Systemaufruf an. Wenn die pfds revents sind und mit einem Wert von 0 hinzugefügt werden, liest der Systemaufruf read die Daten aus dem Puffer aus. Die „if“-Anweisung wird verwendet, um zu überprüfen, ob die read-Anweisung ihren Wert in eine ganze Zahl zurückgegeben hat und um Daten zu schreiben write. Wenn sich die Struktur „pfds“ an Position „1“ befindet, während revent und die Daten eingegeben werden, verwendet der Systemaufruf read die Daten aus einem Puffer, während der Deskriptor „fd“ verwendet wird.

Speichern Sie das Neue.c-Datei und schließen Sie sie. Kompilieren Sie es jetzt mit dem gcc-Compiler.

$ gcc neu.c

Während der Ausführung dieses Codes haben wir Daten in einer Abfrage hinzugefügt, die ausgelesen werden sollen, und es werden Daten wie in der folgenden Ausgabe erneut geschrieben.

$ ./ein.aus

Fazit:

In diesem oben beschriebenen Artikel haben wir den poll()-Systemaufruf in der Sprache C besprochen. Ich hoffe, Sie finden dieses Tutorial hilfreich und effizient bei der Arbeit mit dem Linux-Betriebssystem.

So installieren Sie League of Legends auf Ubuntu 14.04
Wenn Sie ein Fan von League of Legends sind, dann ist dies eine Gelegenheit für Sie, League of Legends zu testen. Beachten Sie, dass LOL von PlayOnLin...
Installieren Sie das neueste OpenRA-Strategiespiel auf Ubuntu Linux
OpenRA ist eine Libre/Free Real Time Strategy Game Engine, die die frühen Westwood-Spiele wie den Klassiker Command & Conquer: Red Alert Red nachbilde...
Installieren Sie den neuesten Dolphin Emulator für Gamecube & Wii unter Linux
Mit dem Dolphin Emulator können Sie Ihre ausgewählten Gamecube- und Wii-Spiele auf Linux-Personalcomputern (PC) spielen. Als frei verfügbarer Open-So...