traced process, zombie => server jede blbe

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Čtvrtek Únor 12 11:57:34 CET 2004


On 12 Feb 2004, Robert Vojta wrote:

> > Jakym zpusobem dam v threadu nebo ve forku child-procesu, ze
> > rodic-proces nevyzvedava navratovy kod??

Pro puvodniho tazatele: znam srozumitelnejsi zpusoby, jak formulovat
otazku.

> V diteti se to nenastavuje, dela to rodic ...
> 
> a) bud nastavite, ze rodic ignoruje signal SIGCHLD, tj.
> 
> b) nebo budete v handleru odchytavat signaly, ted tu nic nemam ale
>    v rychlosti jsem vygoogloval priklad ...

Pro uplnost: nebo nechate SIGCHLD na SIG_DFL a wait() apod. zavolate pri
vhodne prilezitosti. Tohle se treba dela, kdyz je potomek spousten
synchronne: rodic udela fork() a pak wait() a proste si pocka, az
potomek skonci.

> void sig_chld(int signo) 
> {
>     int status, wpid, child_val;
> 
>     printf ("SIGCHLD: In sig_chld signal handler.");

Volat printf() v signal handleru neni dobry napad, protoze stdio neni
reentrantni. Signaly chodi asynchronne a staci, aby se jeden trefil do
okamziku, kdy prave probiha nejaka funkce ze stdio a vrta se v datech,
a bum!

Reentrantni je ostatne podle standardu jen velmi mala cast libc (a take
jen mala cast ostatniho kodu, co byl kdy napsan), cili obecne je zadouci
toho v signal handleru delat co nejmene.

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux