poll (2) löscht die Ereigniswarteschlange - linux nicht

Ich benutze Linux als meine Programmierplattform. Ich benutze poll(2) um zu wissen, ob mein Gerät ein Ereignis auslöst.

Der erste Anruf von poll ist in Ordnung; Es blockiert und wartet auf das Ereignis. Aber in der Sekunde poll Funktionsaufruf, es wird zurückkehren; aber es fängt das Ereignis ein. Unten ist mein Code.

ret = poll( fds, 1, 2000); //2 secs timeout

if( fds[0].revents & POLLIN && ret > 0)
{
printf("event occurn");
}

Es scheint, dass die Warteschlange / der Puffer nicht leer ist. Ich nehme nur an.

Was denkst du ist das Problem?

Vielen Dank.

Antworten:

11 für die Antwort № 1

Offensichtlich, wenn Sie eingehende Daten abfragensollte 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 Ihre pollfd-Struktur zurücksetzen, bevor Sie die Abfrage erneut aufrufen.

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 occurn");
}

Wenn Sie es nicht jedes Mal zurücksetzen, kann Müll von vorherigem Aufruf das Poll-Verhalten ändern (naja, nicht wirklich, das ist nur ein Portabilitätsproblem).

Im Produktionscode müssen Sie auch die Rückgabe überprüfenWert, 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 zur Verfügung gestellt werdenauch 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.


5 für die Antwort № 2

Wenn Sie ein POLLIN-Ereignis haben, was bedeutet "Es gibt Daten zum Lesen" - rufen Sie einige an read() Funktion auf deinem fd vor poll()"Nochmal?


4 für die Antwort № 3

poll gibt Ihnen ein Ereignis, wenn Daten / Ereignisse zu lesen sind / Fehler / wenn Sie schreiben können.

Wenn Sie ein Ereignis erhalten, das besagt, dass die Daten zu lesen sind und Sie nichts lesen, werden beim nächsten Anruf immer noch Daten zu lesen sein poll und du bekommst ein anderes Ereignis.


4 für die Antwort № 4

Es gilt als gute Praxis zu prüfen POLLHUP oder POLLNVAL vor dem Lesen des Dateideskriptors. Aber ich glaube das read() würde nur scheitern, wenn das der Fall wäre, es sei denn, es wird ein Dateideskriptor abgefragt, der für längere Zeit blockiert werden sollte, wie ein Modem. In diesem Fall würden Sie hängen (abhängig davon, was Sie weitergegeben haben) open()).

Sie sind wahrscheinlich nicht:

  • Lese das Ereignis FD überhaupt vor dem nächsten poll(), oder,
  • Lesen aller verfügbaren Daten

Wenn Sie die Struktur initialisiert haben pollfd Array vor dem Aufruf poll()Es sollte keinen "Müll" geben, von dem man sprechen könnte.

Dennoch ist es wahrscheinlich eine gute Idee, auch zu überprüfen und sicher zu sein, dass es etwas gibt, das sich zu stören lohnt read() vor dem Aufruf tun.


Am beliebtesten