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.
Es scheint, dass die Warteschlange / der Puffer nicht leer ist. Ich nehme nur an.
Was denkst du ist das Problem?
Danke.
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.
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.
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:
poll()
, oder, 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.
Tags und Links linux