8.10 Prozesse für eine bestimmte Zeit stoppen – sleep() und usleep()
Muss ein Prozess nur für eine gewisse Zeit oder bis zum Eintreffen eines Signals suspendiert werden, können die Funktionen sleep() bzw. usleep() dazu verwendet werden.
#include <unistd. h.>
unsigned int sleep(unsigned int sekunden);
void usleep(unsigned long mikrosekunden);
Damit wird ein Prozess jeweils in den Parametern der angegebenen Zeiten angehalten. Bei sleep() handelt es sich um Sekunden und bei usleep() um Mikrosekunden. Wird ein suspendierter Prozess durch ein Signal vorzeitig beendet und mit einem Signalhandler abgefangen, gibt sleep() als Rückgabewert die Anzahl der nicht geschlafenen Sekunden zurück.
Hinweis Weitere Möglichkeiten zum zeitlichen Suspendieren von Prozessen haben Sie noch mit den Funktionen select() und nanosleep().
|
Die maximale Präzision, die bei der Suspension erreicht werden kann, hängt vom System und von der Methodik ab. Auf den meisten Linux-Systemen ist dies 1/100s, bei einigen 64-Bit-Rechnern auch 1/1024s. Wer es noch präziser braucht, kann dies über sched_setpriority() (und dann nanosleep()) realisieren, jedoch heißt eine Präzision, die genauer ist als der Standardwert (1/100s), dass während der Suspension andere Prozesse nicht ans Laufen kommen! Eine Anwendung, die also periodisch weniger als 1/100s mittels der Sleep-Funktionen auf ein Ereignis warten würde, würde die CPU kaum noch freigeben. Busy Loops (z. B. eine while()-Schleife) blockieren zwar nicht, jedoch ist die zeitliche Länge einer solchen Schleife natürlich abhängig von der Prozessorgeschwindigkeit und -auslastung, weshalb sie für eine Suspension generell nicht geeignet ist. Anders ausgedrückt: Es gibt keine perfekte Lösung, außer dass man manuell den Kernel auf 1/1000s hochstellen kann, wie es standardmäßig in 2.6 jetzt gemacht worden ist.
|