Hallo LUG,
ich schreibe an einem Gerätetreiber für den Linuxkernel. Dabei stehe ich vor dem Problem, dass ich auf zwei verschiedene Ereignisse (nennen wir sie mal E1 und E2) warten muss. Dazu rufe ich
wait_event_interruptable(waitqueue, E1 && E2);
auf. Wacht der Thread jetzt automatisch auf, sobald E1 und E2 wahr sind? Oder muss ich ich ihn explizit mit wake_up(waitqueue) aufwecken? Wird nach dem Aufwachen die Bedingung (E1 && E2) nachmal geprüft und sich bei nicht Erfüllen wieder schlafen gelegt?
Grüße
Markus ______________________________________________________________ Verschicken Sie romantische, coole und witzige Bilder per SMS! Jetzt bei WEB.DE FreeMail: http://f.web.de/?mc=021193
Markus schrieb:
ich schreibe an einem Gerätetreiber für den Linuxkernel. Dabei stehe ich vor dem Problem, dass ich auf zwei verschiedene Ereignisse (nennen wir sie mal E1 und E2) warten muss. Dazu rufe ich
wait_event_interruptable(waitqueue, E1 && E2);
auf. Wacht der Thread jetzt automatisch auf, sobald E1 und E2 wahr sind? Oder muss ich ich ihn explizit mit wake_up(waitqueue) aufwecken? Wird nach dem Aufwachen die Bedingung (E1 && E2) nachmal geprüft und sich bei nicht Erfüllen wieder schlafen gelegt?
In der Programmierung von Treibern habe ich keine Erfahrung. Aber vielleicht hilft die folgendes weiter:
Auszug aus http://ezs.kr.hsnr.de/TreiberBuch/html/ (unter "Anhang C. Makros und Funktionen des Kernels kurz gefasst")
<Zitat> wait_event_interruptible
#include <linux/wait.h>
int wait_event_interruptible (wait_queue_head_t wait_queue, condition);
Dieses Makro legt einen Prozess auf die Wait-Queue »wait_queue« so lange schlafen, bis die Bedingung »condition« erfüllt ist.
if( wait_event_interruptible( read_queue, (readptr>writeptr) ) ) return -ERESTART;
Die Bearbeitung wird durch Signale unterbrochen.
Das Makro versetzt den aktiven Prozess (current) in den Zustand Warten (INTERRUPTIBLE), falls die Bedingung »condition« nicht erfüllt ist.
Rückgabewert. Die Funktion gibt »0« zurück, falls die Wartebedingung erfüllt ist, und einen Wert ungleich Null, falls die Funktion unterbrochen wurde. Wird der wartende Prozess durch ein Signal aufgeweckt, gibt die Funktion »-ERESTARTSYS« zurück. </Zitat>
Gruß, Frank
lug-dd@mailman.schlittermann.de