pollset_create, pollset_ctl, pollset_destroy, pollset_poll, pollset_query, pollset_ctl_ext, pollset_poll_ext, pollset_query_ext, und pollset_ext Unterroutinen
Zweck
Überprüfung des E/A-Status mehrerer Dateideskriptoren.
Bibliothek
Standard-C-Bibliothek (libc.a)
Syntax
#include <sys/poll.h>
#include <sys/pollset.h>
#include <sys/fcntl.h>
pollset_t ps = pollset_create(int maxfd)
int rc = pollset_destroy(pollset_t ps)
int rc = pollset_ctl(pollset_t ps, struct poll_ctl *pollctl_array,
int array_length)
int rc = pollset_query(pollset_t ps, struct pollfd *pollfd_query)
int nfound = pollset_poll(pollset_t ps,
struct pollfd *polldata_array,
int array_length, int timeout)
int rc = pollset_ctl_ext(pollset_t ps, struct poll_ctl_ext* pollctl_array,
int array_length)
int rc = pollset_query_ext(pollset_t ps, struct pollfd_ext *pollfd_query)
int nfound = pollset_poll_ext(pollset_t ps,
struct pollfd_ext *polldata_array,
int array_length, int timeout)
int pollset_ext(void)
Beschreibung
Die ' pollset (API) fragt effizient einen großen Dateideskriptorensatz ab. Diese Schnittstelle ist am besten geeignet, wenn der Dateideskriptorensatz nicht häufig aktualisiert wird. Die Subroutine pollset kann eine signifikante Leistungsverbesserung gegenüber traditionellen select -und poll -APIs bereitstellen. Die Verbesserungen sind am deutlichsten, wenn die Anzahl der pro Abfragevorgang zurückgegebenen Ereignisse im Verhältnis zur Anzahl der abgefragten Dateideskriptoren gering ist.
Die pollset -API verwendet Systemaufrufe für das Polling. Ein Dateideskriptorensatz (oder Pollset) wird mit einem erfolgreichen Aufruf von " pollset_create eingerichtet. Dateideskriptoren und Abfrageereignisse werden mit dem Unterprogramm " pollset_ctl hinzugefügt, entfernt oder aktualisiert. Das Unterprogramm " pollset_poll wird aufgerufen, um den Abrufvorgang durchzuführen. Ein ' pollset_query wird aufgerufen, um abzufragen, ob ein Dateideskriptor im aktuellen Poll-Set enthalten ist. Erweiterte Versionen der Control-, Poll- und Query-Subroutinen sind vorhanden, um Anwendungen die Nutzung von Funktionen zu erleichtern, die nur in den erweiterten Pollset-Formaten vorhanden sind.
-1 hat, wird die maximale Anzahl von Dateideskriptoren, die zum Pollset gehören können, durch ' OPEN_MAX begrenzt, wie in ' <sys/limits.h> definiert (die AIX® der offenen Dateideskriptoren pro Prozess). AIX sieht eine systemweite Begrenzung auf 245025 aktive Pollsets zu einem Zeitpunkt vor. Bei einem Fehlschlag gibt dieser Systemaufruf ' -1 mit entsprechend gesetztem ' errno zurück. Bei Erfolg wird eine Pollset-ID vom Typ ' pollset_t zurückgegeben: typedef int pollset_t
Die Pollset-ID darf von der Anwendung nicht verändert werden. Die Pollset-API prüft, ob die ID nicht " -1 ist. Außerdem muss die Prozess-ID der Anwendung mit der Prozess-ID übereinstimmen, die zum Zeitpunkt der Pollset-Erstellung gespeichert wurde.
Ein Pollset wird mit einem erfolgreichen Aufruf von " pollset_destroy zerstört. Bei Erfolg gibt dieser Systemaufruf ' 0 zurück. Bei einem Fehler gibt die Subroutine pollset_destroy -1 zurück, wobei errno auf den entsprechenden Code gesetzt ist. Ein ' errno von ' EINVAL bedeutet eine ungültige Pollset-ID.
Dateideskriptoren müssen dem Pollset mit dem Unterprogramm " pollset_ctl oder " pollset_ctl_ext hinzugefügt werden, bevor sie überwacht werden können. Ein heterogenes Array von " poll_ctl Strukturen und/oder " poll_ctl_ext -Strukturen wird über " pollctl_array" an " pollset_ctl oder " pollset_ctl_ext übergeben. Der Parameter " array_length gibt die Anzahl der eindeutigen " poll_ctl or poll_ctl_ext im Array an.
Jede poll_ctl -Polling-Steuerstruktur enthält ein Feld version, command, fdund events . Diese Struktur ist abwärtskompatibel mit der Definition aus früheren AIX, wenn das Feld version auf 0 gesetzt ist. Die erweiterte Polling-Steuerstruktur poll_ctl_extfügt ein zusätzliches Feld zum Speichern benutzerdefinierter Daten hinzu, wenn das Feld version auf 1 gesetzt ist. Das Feld fd definiert den Dateideskriptor, der das Ziel des Befehls ist. Das Feld events enthält relevante Ereignisse. Wenn der " PS_ADD ist, fügt der " pollset_ctl - oder " pollset_ctl_ext -Aufruf einen gültigen offenen Dateideskriptor zum " pollset hinzu. Wenn sich bereits ein Dateideskriptor im Pollset befindet, führt ' PS_ADD dazu, dass ' pollset_ctl oder ' pollset_ctl_ext einen Fehler zurückgibt. Wenn der Befehl " PS_MOD lautet und der Dateideskriptor bereits im " pollset ist, werden die Bits im Ereignisfeld zu den überwachten Ereignissen hinzugefügt (ODER-verknüpft). Wenn sich der Dateideskriptor nicht bereits in " pollset befindet, entspricht das Verhalten von " PS_MOD dem von PS_ADD und fügt einen gültigen offenen Dateideskriptor in " pollset ein.
Abrufereignisse und benutzerdefinierte Daten können für einen Dateideskriptor, der sich derzeit im " pollset befindet, mit dem Befehl " PS_REPLACE aktualisiert werden. Wenn der Befehl " PS_DELETE lautet und der Dateideskriptor sich bereits im Pollset befindet, entfernt " pollset_ctl oder " pollset_ctl_ext den Dateideskriptor aus dem " pollset. Wenn sich der Dateideskriptor nicht bereits in " pollset befindet, führt " PS_DELETE dazu, dass " pollset_ctl oder " pollset_ctl_ext einen Fehler zurückgeben.
Die Schnittstelle " pollset_query oder " pollset_query_ext kann verwendet werden, um Informationen über einen Dateideskriptor in Bezug auf das Pollset zu ermitteln. Wenn sich der Dateideskriptor im Pollset befindet, gibt ' pollset_query oder ' pollset_query_ext ' 1 ' zurück, und die Ereignisse werden auf die derzeit überwachten Ereignisse gesetzt. Wenn vorhanden, werden auch benutzerspezifische Daten für den Dateideskriptor zurückgegeben, was durch das Vorhandensein des Ereignisses " POLLEXT angezeigt wird.
Das Unterprogramm " pollset_poll oder " pollset_poll_ext bestimmt, für welche Dateideskriptoren im Pollset Ereignisse anstehen. Der Parameter polldata_array enthält eine Pufferadresse, an die die Strukturen " pollfd oder " pollfd_ext für Dateideskriptoren mit anstehenden Ereignissen zurückgegeben werden. Die Anzahl der von einer Abfrage zurückgegebenen Ereignisse ist durch array_length begrenzt. Der Timeout-Parameter gibt die Zeit an, die gewartet werden soll, wenn keine Ereignisse anstehen. Die Einstellung von timeout auf ' 0 garantiert, dass das Unterprogramm ' pollset_poll oder ' pollset_poll_ext sofort zurückkehrt. Wenn Sie timeout auf ' -1 setzen, wird eine unendliche Zeitspanne festgelegt. Andere positive Werte ungleich null geben die Wartezeit in Millisekunden an.
Wenn Ereignisse von einer " pollset_poll oder " pollset_poll_ext zurückgegeben werden, enthält jede " pollfd oder " pollfd_ext ein fd-Feld mit dem eingestellten Dateideskriptor, ein events-Feld mit den angeforderten Ereignissen und ein revents-Feld mit den eingetretenen Ereignissen. Pollset-Ereignisse, die benutzerdefinierte Daten enthalten, geben diese im Datenfeld der " pollfd_ext zurück und zeigen ihr Vorhandensein mit dem " POLLEXT im Ereignisfeld an.
Auf ein einzelnes Pollset kann von mehreren Threads in einem Multithreading-Prozess zugegriffen werden. Wenn mehrere Threads ein Pollset abfragen und ein Ereignis für einen Dateideskriptor eintritt, wird möglicherweise nur ein Thread aufgefordert, das Ereignis zu empfangen. Nachdem ein Dateideskriptor an einen Thread zurückgegeben wurde, werden bis zum nächsten " pollset_poll oder " pollset_poll_ext -Aufruf keine neuen Ereignisse erzeugt. Dieses Verhalten verhindert, dass alle Threads bei jedem Ereignis zur Eingabe aufgefordert werden. Mehrere Threads können gleichzeitig ' pollset_poll oder ' control durchführen. Wenn ein Benutzer serialisierte Pollset-Änderungen wünscht, sollte die Umgebungsvariable PS_CTL_BLOCKING auf ' yes gesetzt werden, damit ' pollset_ctl oder ' pollset_ctl_ext -Aufrufe blockiert werden, bis alle laufenden Threads in ' pollset_poll oder ' pollset_poll_ext beendet sind. Ein Thread, der ' pollset_destroy aufruft, wird so lange blockiert, bis alle Threads die Systemaufrufe pollset poll, control und query verlassen haben.
Ein Prozess kann fork aufrufen, nachdem pollset_createaufgerufen wurde. Der untergeordnete Prozess hat bereits eine Pollset-ID pro Pollset, aber die Operationen ' pollset_destroy, ' pollset_ctl, ' pollset_ctl_ext, ' pollset_query, pollset_query_ext, ' pollset_poll und ' pollset_poll_ext schlagen fehl, wenn ' errno den Wert ' EACCES hat.
Nachdem ein Dateideskriptor zu einem Pollset hinzugefügt wurde, wird der Dateideskriptor erst wieder entfernt, wenn ein ' pollset_ctl oder ein ' pollset_ctl_ext -Aufruf zusammen mit dem ' PS_DELETE -Befehl ausgeführt wird. Der Dateideskriptor bleibt im Pollset, auch wenn der Dateideskriptor geschlossen wird. Eine " pollset_poll oder " pollset_poll_ext für ein Pollset, das einen geschlossenen Dateideskriptor enthält, liefert ein " POLLNVAL für diesen Dateideskriptor. Wenn der Dateideskriptor später einem neuen Objekt zugewiesen wird, wird das neue Objekt bei künftigen " pollset_poll oder " pollset_poll_ext -Aufrufen abgefragt.
Anwendungen können ' pollset_ext verwenden, um den Betrieb in AIX zu unterstützen, die keine erweiterten Pollset-Funktionen unterstützen. Ein Rückgabewert von " true (1) bedeutet, dass erweiterte Pollsets unterstützt werden, während ein Rückgabewert von " false (0) bedeutet, dass nur die alten Pollset-Strukturen und APIs unterstützt werden.
Parameter
| Element | Beschreibung |
|---|---|
| Feldlänge | Gibt die Länge der Array-Parameter an. |
| maxfd | Gibt die maximale Anzahl von Dateideskriptoren an, die zum Pollset gehören können. |
| pollctl_array | Der Zeiger auf ein homogenes oder heterogenes Array von poll_ctl -und poll_ctl_ext -Strukturen, der die Dateideskriptoren (über die Struktur pollfd oder pollfd_ext ) und die eindeutige Operation beschreibt, die für jeden Dateideskriptor ausgeführt werden soll (Hinzufügen, Entfernen oder Ändern). |
| Abfragedatenarray | Gibt die angeforderten Ereignisse zurück, die auf dem Pollset aufgetreten sind. |
| Abfrageabfrage | Zeigt auf einen Dateideskriptor, der zum Pollset gehören kann oder auch nicht. Wenn er zum Pollset gehört, wird das Feld "Angeforderte Ereignisse" dieses Parameters aktualisiert, um wiederzugeben, was derzeit für diesen Dateideskriptor überwacht wird. |
| ps | Gibt die Pollset-ID an. |
| Zeitlimit | Gibt an, wie lange (in Millisekunden) auf das Auftreten überwachter Ereignisse gewartet wird. Der Wert -1 wird blockiert, bis ein überwachtes Ereignis eintritt. |
Rückgabewerte
Bei Erfolg gibt die Subroutine pollset_destroy 0zurück. Bei einem Fehler gibt die Subroutine pollset_destroy -1 zurück, wobei errno auf den entsprechenden Code gesetzt ist.
Bei Erfolg gibt das Unterprogramm " pollset_create eine Pollset-ID des Typs " pollset_t zurück. Bei einem Fehlschlag gibt dieser Systemaufruf ' -1 mit entsprechend gesetztem ' errno zurück.
Bei Erfolg gibt pollset_ctl oder pollset_ctl_ext 0zurück. Bei einem Fehler gibt pollset_ctl oder pollset_ctl_exit die 0-basierte Problemelementnummer von pollctl_array zurück (z. B. wird 2 für Element 3 zurückgegeben). Wenn das erste Element das Problemelement ist oder vor der Verarbeitung des Elementarrays ein anderer Fehler auftritt, wird -1 zurückgegeben und errno auf den entsprechenden Code gesetzt. Die aufrufende Anwendung muss bestätigen, dass Elemente im Array vor dem Problemelement erfolgreich verarbeitet wurden, und versuchen, pollset_ctl oder pollset_ctl_ext erneut mit den Elementen von pollctl_array aufzurufen, die über das problematische Element hinausgehen.
Ist ein Dateideskriptor nicht Teil des Pollsets, gibt " pollset_query oder " pollset_query_ext " 0" zurück. Befindet sich der Dateideskriptor im Pollset, gibt ' pollset_query oder ' pollset_query_ext ' 1' zurück, werden die Ereignisse auf die aktuell überwachten Ereignisse gesetzt, und wenn vorhanden, wird das Datenfeld auf die vom Benutzer angegebenen Daten gesetzt. Tritt ein Fehler auf, nachdem versucht wurde, festzustellen, ob der Dateideskriptor Mitglied des Pollsets ist, dann gibt ' pollset_query oder ' pollset_query_ext ' -1 zurück, wobei ' errno auf den entsprechenden Rückgabewert gesetzt wird.
Die Subroutine pollset_poll oder pollset_poll_ext gibt die Anzahl der Dateideskriptoren zurück, für die angeforderte Ereignisse aufgetreten sind. Wenn in keinem der Dateideskriptoren angeforderte Ereignisse aufgetreten sind, wird 0 zurückgegeben. Der Wert -1 wird zurückgegeben, wenn ein Fehler auftritt und errno auf den entsprechenden Code gesetzt ist.
Fehlercodes
| Element | Beschreibung |
|---|---|
| EACCES | Der Prozess hat keine Berechtigung, auf ein Pollset zuzugreifen. |
| EAGAIN | Systemressource vorübergehend nicht verfügbar. |
| EFAULT | Angegebene Adresse war ungültig. |
| EINTR | Während des Systemaufrufs wurde ein Signal empfangen. |
| EINVAL | Ungültiger Parameter. |
| ENOMEM | Nicht genügend Systemspeicher verfügbar. |
| ENOSPC | Maximale Anzahl der verwendeten Pollsets. |
| EPERM | Der Prozess hat keine Berechtigung, ein Pollset zu erstellen. |
| ENOTSUP | Das Gerät unterstützt die angeforderte Ereigniskombination nicht. |