XCHAOS: Samozrejme, ze muze prijit v prubehu volani. Z toho jsou hilarious chyby.
A pokud jsi nevedel tohle, pak dalsi interesting fact: Spousta funkci standardni knihovny je implementovana tak, ze pouziva nejakej buffer jako globalni promennou. Takze, kdyz udelam trivialni priklad:
void le_sighandler(int signum) {
printf("Yo dawg, I herd you like printf, so I put some printf in your printf."); // printf_sighandler
}
foo() {
signal(SIGWHATEVER, &le_sighandler);
printf("printfing %s", "like a boss"); // printf_foo
}
...
pak muze probihat exekuce tak, ze:
1) vleze se do printf_foo
2) printf_foo neco malo dela, a uklada si to do onoho globalniho bufferu -- jeste ale neskoncil
3) prijde signal SIGWHATEVER, a spusti se le_sighandler
4) printf_sighandler vyhodi do bufferu to co ma, flushne ho na stdout, a sighandler skonci
5) onen globalni buffer nyni neobsahuje to co obsahoval v bode 2, ale nejakej podezrelej bordel (jako treba prazdnej string)
6) printf_foo vesele pokracuje
7) ???
8) PROFIT
...tohle je samozrejme vseobecne platnej princip, ale printf priklad je takovej hezkej