Warum wird dieser Aufruf von 'poll' nicht korrekt in einer sysfs-Geräteattributdatei blockiert?

8

Ich habe ein einfaches sysfs-Geräteattribut , das unter meinem Verzeichnis sysfs angezeigt wird. Bei einem Aufruf von read wird der Wert einer Kernelspace-Variablen zurückgegeben. Ich möchte poll für dieses Attribut aufrufen, damit mein Userspace-Thread blockieren kann, bis sich der Wert des Attributs ändert.

Mein Problem ist, dass poll mein Attribut nicht zu blockieren scheint - es gibt POLLPRI zurück, obwohl sich der Wert des Attributs nicht ändert. Tatsächlich habe ich überhaupt keine Aufrufe an sysfs_notify im Kernelmodul, aber der Userspace-Aufruf poll blockiert immer noch nicht.

Vielleicht sollte ich nach einem Rückgabewert von etwas anderem als POLLPRI suchen - aber Laut der Dokumentation im Kernel Linux sollte sysfs_poll POLLERR|POLLPRI :

zurückgeben %Vor%

Gibt es etwas, das ich mit poll vergessen habe?

  1. Das Geräteattribut befindet sich unter: / sys / class / vilhelm / foo / blah .

  2. Ich lade ein Kernelmodul namens foo , das ein Gerät registriert und eine Klasse und dieses Geräteattribut erstellt.

  3. Die Userspace-Anwendung namens bar ruft einen Thread auf, der poll für das Geräteattribut aufruft und nach POLLPRI sucht.

    • Wenn poll eine positive Zahl zurückgibt, wurde POLLPRI zurückgegeben.
    • Verwenden Sie fopen und fscan , um den Wert aus der Geräteattributdatei zu lesen.
    • Wenn der Wert 42 ist, drucken Sie VON THREAD !!! .

Das Problem besteht darin, dass die Nachricht nonstop gedruckt wird, wenn ich erwarte, dass der Aufruf von poll auf unbestimmte Zeit blockiert wird. Das Problem muss bei poll liegen (die anderen Aufrufe erhalten den korrekten Wert von 42 vom Geräteattribut).

Benutzerbereichsanwendung - bar.c :

%Vor%

Kernelmodul - foo.c :

%Vor%

Siehe auch

  

Verwenden des Linux-Aufrufs sysfs_notify

    
Vilhelm Gray 08.05.2013, 14:10
quelle

1 Antwort

8

Um noch mehr aus dem zitierten Kommentar zu zitieren:

  

Sobald poll / select anzeigt, dass der Wert sich geändert hat, Sie   müssen Sie die Datei schließen und erneut öffnen, oder versuchen Sie 0 und lesen Sie es erneut.

Aber Sie tun nichts mit fds.fd .

Mache auch einen Dummy read() , bevor du poll() aufruft; Jede neu geöffnete Datei wird als geändert betrachtet.

    
CL. 13.05.2013, 14:15
quelle