Odchyceni signalu
Jan Kasprzak
kas na informatics.muni.cz
Pondělí Říjen 2 20:22:54 CEST 2000
Petr Novotny wrote:
:
: void sigpipe_handler(int sig_num)
: {
: assert(sig_num==SIGPIPE);
: printf("Inside handler");
: }
:
: main()
: {
: signal(SIGPIPE,sigpipe_handler);
: for(;;);
: }
:
Poznamka k portabilite (mimo puvodni subject): Neni uplne stastne
v signalovem handleru volat knihovni funkce jako treba printf(), ktere
obvykle nejsou reentrantni. Muze to vest k chybnym vysledkum[1], nebo
i k padu programu[2].
[1]:
printf("trubka"); /* Coz je totez jako nasledujici:
* zkopiruj retezec do interniho bufferu
===> *
* inkrementuj ukazatel na konec bufferu o delku retezce
* je-li buffer plny (nebo je-li v retezci "\n"), zavolej
* write(1, buffer, velikost_bufferu)
*/
Pokud v miste oznacenem sipkou prijde signal, jehoz handler vola
printf("roura"), zkopiruje se retezec "roura" do bufferu tak,
ze prepise puvodni retezec "trubka". Pak se posune ukazatel konce
bufferu o delku retezce "roura" a po navratu z handleru je jeste
inkrementovan o delku retezce "trubka", ktery je ale castecne prepsan
a ve zbytku je srot.
[2]:
Pokud se handler provadi s jinym zasobnikem, nez je puvodni
zasobnik procesu a handler nebo knihovni funkce z neho volana
se pokusi pristoupit k puvodnimu zasobniku (viz sigaltstack(2)).
Takhle se mi choval printf() napriklad v NetBSD 0.8 a 0.9 - z nejakeho
duvodu program padal se SIGFPE :-O
-Yenya
--
\ Jan "Yenya" Kasprzak <kas at fi.muni.cz> http://www.fi.muni.cz/~kas/
\\ PGP: finger kas at aisa.fi.muni.cz 0D99A7FB206605D7 8B35FCDE05B18A5E //
\\\ Czech Linux Homepage: http://www.linux.cz/ ///
/// I find that rebooting the machine and cursing myself is one of the \\\
// most effective kernel debugging methods. -Victor Yodaiken \\
Další informace o konferenci Linux