====== 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);