====== Signály ======
===== špeky =====
* 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.
* místo sleep je doporučeno používat select nebo poll
select(0, NULL, NULL, NULL, &tv);
poll(0, 0, milliseconds);