poll()
stellt Anwendungen einen Mechanismus für das Multiplexen von Ein-/Ausgaben über einen Satz von offenen Dateideskriptoren zur Verfügung. Für jedes Feldelement, auf das fds zeigt, überprüft poll()
, ob für den entsprechenden Dateideskriptor eines oder mehrere der in events aufgelisteten Ereignisse eingetreten ist. Die Anzahl pollfd
-Strukturen im Feld fds wird durch den Wert nfds angegeben. poll()
identifiziert die Dateideskriptoren, auf denen die Anwendung lesen oder schreiben kann oder für die Ereignisse eingetroffen sind.
fds legt die zu prüfenden Dateideskriptoren fest sowie die Ereignisse, die für den jeweiligen Dateideskriptor abgefragt werden sollen. fds ist ein Zeiger auf ein Feld mit jeweils einem Element für jeden zu prüfenden Dateideskriptor. Die Elemente des Feldes sind pollfd
-Strukturen, die Folgendes enthalten:
int fd; /* offener Dateideskriptor */
short events; /* abzufragende Ereignisse */
short revents; /* eingetretene Ereignisse */
fd bezeichnet einen offenen Dateideskriptor, events
und revents
sind Bitmasken, die durch ODER-Verknüpfung aus den folgenden Flags aufgebaut werden (es sind beliebige Kombinationen zulässig):
POLLIN
| Daten, die nicht die höchste Priorität haben, können nichtblockierend gelesen werden. Für STREAMS wird dieses Flag in revents auch dann gesetzt, wenn die Nachricht die Länge 0 hat. |
POLLRDNORM
| Normale Daten (Priorität = 0) können nichtblockierend gelesen werden. Für STREAMS wird dieses Flag in revents auch dann gesetzt, wenn die Nachricht die Länge 0 hat. |
POLLRDBAND
| Daten mit Priorität != 0 können nichtblockierend gelesen werden. Für STREAMS wird dieses Flag in revents auch dann gesetzt, wenn die Nachricht die Länge 0 hat. |
POLLPRI
| Daten mit höchster Priorität können nichtblockierend empfangen werden. Für STREAMS wird dieses Flag in revents auch dann gesetzt, wenn die Nachricht die Länge 0 hat. |
POLLOUT
| Normale Daten (Priorität = 0) können nichtblockierend geschrieben werden. |
POLLWRNORM
| wie POLLOUT . |
POLLWRBAND
| Daten mit Priorität != 0 können geschrieben werden. |
POLLMSG
| Eine M_SIG - oder M_PCSIG -Nachricht, die ein ASIGPOLL -Signal enthält, hat den Anfang der Stream-Kopf-Warteschlange erreicht. |
POLLERR
| Es ist ein Fehler aufgetreten für den STREAM oder die Gerätedatei. Dieses Flag ist nur in der revents -Bitmaske gültig; in der Bitmaske events wird es ignoriert. |
POLLHUP
| Im STREAM ist ein Hangup aufgetreten (die Verbindung zum Gerät ist unterbrochen). POLLHUP und POLLOUT schließen sich gegenseitig aus; auf einen Stream kann niemals geschrieben werden, wenn ein Hangup aufgetreten ist. Jedoch schließen sich dieses Ereignis und POLLIN bzw. POLLRD- NORM , POLLRDBAND oder POLLPRI nicht gegenseitig aus. Das Flag POLLHUP ist nur in der revents -Bitmaske gültig; in der Bitmaske events wird es ignoriert. |
POLLNVAL
| Der angegebene fd-Wert ist ungültig. Dieses Flag ist nur in der revents -Bit- maske gültig; in der Bitmaske events wird es ignoriert. |
Wenn der Wert in fd kleiner als null ist, wird events
ignoriert, und revents
wird bei der Rückkehr von poll()
für diesen Feldeintrag auf 0 gesetzt.
Die Ergebnisse der poll()
-Anfrage werden im revents
-Feld in der pollfd
-Struktur angezeigt. poll()
setzt zunächst alle Bits in revents
auf null. Falls eines oder mehrere der in events
abgefragten Ereignisse eingetroffen ist, setzt poll()
die entsprechenden Bits in revents
. Die Bits für POLLHUP
, POLLERR
und POLLNVAL
werden beim Eintreffen der entsprechenden Ereignisse automatisch in revents
gesetzt; sie müssen in events
nicht gesetzt sein.
Wenn die Überprüfung ergibt, dass keines der für die Dateideskriptoren abgefragten Ereignisse eingetreten ist, wartet poll()
wenigstens timeout Millisekunden auf das Auftreten eines Ereignisses für einen der angegebenen Dateideskriptoren. Bei einem Rechner, bei dem die Genauigkeit auf Millisekunden nicht zur Verfügung steht, wird timeout auf den nächsten zulässigen Wert aufgerundet, der in diesem System zur Verfügung steht. Wenn der Wert von timeout 0 ist, kehrt poll()
sofort zurück. Hat timeout den Wert -1, wartet poll()
, bis eines der abgefragten Ereignisse auftritt, oder bis der Aufruf unterbrochen wird (blockierender Aufruf von poll()
).
poll()
wird von den Flags O_NDELAY
und O_NONBLOCK
nicht beeinflusst.
poll()
unterstützt Textdateien, Terminals, Pseudo-Terminals, STREAMS-basierte Dateien, FIFO-Dateien und Pipes, Sockets und XTI.
Bei Textdateien liefert poll()
immer ein TRUE für das Lesen und Schreiben.