Offensichtlich, wenn Sie eingehende Daten abfragen, sollten Sie verfügbare Daten konsumieren (Aufruf von read()) oder es wird immer noch da sein und die Umfrage wird sofort zurückkehren. Symmetrisch ist für POLLOUT eigentlich keine Operation notwendig, aber normalerweise möchten Sie so schnell wie möglich das nächste write() aufrufen. Also als Faustregel POLLIN -> lesen, POLLOUT -> schreiben.
Sie sollten auch Sie pollfd Struktur vor dem erneuten Aufruf der Umfrage zurücksetzen.
fds[0].fd = sck;
fds[0].events = POLLIN;
fds[0].revents = 0;
ret = poll(fds, 1, 2000); //2 secs timeout
if(fds[0].revents & POLLIN && ret > 0)
{
printf("event occur\n");
}
Wenn Sie es nicht jedes Mal zurückgesetzt, Müll aus früherem Aufruf kann Umfrage Verhalten ändern (na ja, nicht wirklich, das ist nur eine Portabilität Ausgabe).
Im Produktionscode müssen Sie auch den Rückgabewert überprüfen, da die Abfrage möglicherweise aus einem anderen Grund als dem erwarteten Ereignis unterbrochen wurde (wie ein Signal). Dann möchten Sie es normalerweise wieder aufrufen, anstatt Daten zu lesen, die nicht verfügbar sind (zur Erinnerung, der Poll-Rückgabewert ist die Anzahl der Ereignisse, 0 Timeout, -1 ein Fehler, dessen Nummer in errno ist).
Fehler bei Dateideskriptoren, die zur Abfrage bereitgestellt werden, können ebenfalls auftreten. Sie führen nicht dazu, dass Poll einen Fehler zurückgibt, sondern setzen POLLERR, POLLHUP oder POLLNVAL im revent-Feld der pollfd-Struktur für diesen Dateideskriptor. Wenn diese Ereignisse gesetzt sind, ruft der Aufruf von read einige Fehlercodes auf, die Sie überprüfen können.
Danke, aber ich brauche diese Daten nicht zu lesen. Das Wichtigste für mich ist, dass es ein Ereignis gibt. Denkst du, ich muss das lesen? Gibt es eine Möglichkeit, den Puffer zu löschen? – domlao
Ich denke, Sie müssen diese Daten lesen. –
Ich sehe, danke, ich denke, das tun müssen. – domlao