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
:
Gibt es etwas, das ich mit poll
vergessen habe?
Das Geräteattribut befindet sich unter: / sys / class / vilhelm / foo / blah .
Ich lade ein Kernelmodul namens foo , das ein Gerät registriert und eine Klasse und dieses Geräteattribut erstellt.
Die Userspace-Anwendung namens bar ruft einen Thread auf, der poll
für das Geräteattribut aufruft und nach POLLPRI
sucht.
poll
eine positive Zahl zurückgibt, wurde POLLPRI
zurückgegeben. fopen
und fscan
, um den Wert aus der Geräteattributdatei zu lesen. 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%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.
Tags und Links linux linux-device-driver linux-kernel blocking polling