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