poll (2) löscht die Ereigniswarteschlange nicht

8

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

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

%Vor%

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

Was denkst du ist das Problem?

Danke.

    
domlao 11.06.2010, 08:01
quelle

4 Antworten

11

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 - & gt; lesen, POLLO - & gt; schreibe.

Sie sollten auch Ihre pollfd-Struktur zurücksetzen, bevor Sie die Abfrage erneut aufrufen.

%Vor%

Wenn Sie es nicht jedes Mal zurücksetzen, kann Müll von vorherigem Aufruf das Abstimmverhalten ändern (naja, nicht wirklich, das ist nur ein Problem der Portabilität).

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 erneut 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 den zur Abfrage bereitgestellten Dateideskriptoren 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.

    
kriss 11.06.2010 08:13
quelle
5

Wenn Sie ein POLLIN-Ereignis haben, was bedeutet: "Es gibt Daten zum Lesen" - rufen Sie% read() -Funktion auf Ihrem fd vor poll() 'wieder auf?

    
zed_0xff 11.06.2010 08:07
quelle
4

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

Wenn Sie ein Ereignis erhalten, das sagt "Es gibt Daten zu lesen" und Sie nichts lesen - es wird immer noch "Daten zu lesen" beim nächsten Aufruf von poll und Sie erhalten ein anderes Ereignis.

    
nos 11.06.2010 09:37
quelle
4

Es wird empfohlen, vor dem Lesen des Dateideskriptors nach POLLHUP oder POLLNVAL zu suchen. Ich glaube jedoch, dass read() einfach fehlschlagen würde, wenn dies der Fall wäre, es sei denn, man fragt einen Dateideskriptor ab, der für längere Zeiträume blockierte, wie ein Modem . In diesem Fall würden Sie hängen (abhängig davon, was Sie an open() weitergegeben haben).

Sie sind wahrscheinlich nicht:

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

Wenn Sie das Array struct pollfd vor dem Aufruf von poll() initialisiert haben, sollte es keinen "Müll" mehr geben.

Dennoch ist es wahrscheinlich eine gute Idee, auch zu überprüfen und sicher zu sein, dass es etwas gibt, das es wert ist, read() vor dem Aufruf zu erledigen.

    
Tim Post 11.06.2010 09:10
quelle

Tags und Links