sleep() vs alarm() není dobré používat současně, protože se ovlivňují
alarm nastavuje časovač pro zaslání signálu SIGALRM
sleep také nastavuje časovač pro zaslání signálu. Přesněji:
uloží si původní handler SIGALRM a zbývající čas
nastaví handler a časovač pro sebe, po uplynutí pokračuje
vrátí zbývající čas a handler SIGALRM na puvodní
pokud se nastaví alarm a nějaký handler, zavolání sleep tento alarm pozastaví.
Příklad:
static int timeout;
static void IntHandler(int signal) {
switch (signal) {
case SIGALRM:
timeout = 1;
break;
default:
// ignore everything we don't know
break;
}
} /* End of IntHandler */
main() {
timeout=0;
alarm(10);
while(!timeout) {
sleep(1);
}
printf("finished\n");
}
uvedeny kod ma nastaven alarm na 10s. Obsahuje cyklus, ktery se provadi, dokud neni nastavena hodnota timeout. V každé iteraci se čeká 1s. Cyklus poběží mnohem déle, než by se na první pohled zdálo. Během volání sleep je totiž čítač alarmu pozastaven.
select(0, NULL, NULL, NULL, &tv);
poll(0, 0, milliseconds);