[linux] Help needed:Nedorucenie SIGCHLD rodicovi alebo SIGCHLD nema pending: Pocitanie SIGCHLD a vytvaranie "zombiekov" a teda neprijatie vsetkych SIGCHLD.PLS HLP

peter Fodrek fodrek na kasr.elf.stuba.sk
Čtvrtek Červen 20 16:02:37 CEST 2002



Vazeny LINUX wizards!


Uz som zistil pricinu chybneho pocitania... rodic nedostal SIGCHLD alebo nebol tento ignorovany ale ani zaradeny medzi pending signals..

Zistil som to tak, ze som pred 

while(ukoncenych!=spustenych)


dal kod 

for(i=0;i<spustenych;i++)
{
wait(&statlog);
printf("Ukoncenych:%ld/%ld\n",ukoncenych,spustenych);
}
ukoncenych=spustenych; 


a  vo void ukoncil(int sig)

som vyhodil riadok s volanim  wait


aj po tejto zmene program "stuhol" na wait(&statlog) pri 105 procesoch z ktorych bolo 80 zombie...(program ma 165 procesov)
no po kill -9  PID_rodica sa znova rozbehol. Tentoraz vsak bolo menej printf-ov ale prijatych signalov bolo 46-58 (ostatne udaje pre 58 ale aj tak chyba 1 proces 58+105=163+1rodic=164 procesov namiesto 165, cize jeden niekde viazne- mozno sa len system nevratil z volania wait, ktore uspesne zrealizoval) v zavislosti od toho co bobim na inych konzolach ps |egrep nazov_prg|egrep zombie|wc -l alebo ps |egrep nazov_prg|wc -l, ci nieco podobne
a ako casto to robim, pripadne od pouzitia ci nepouzitia nice v programe (prg bezi pod oboma uid root).


Uz skutocne netusim ako je to mozne.. kernel musim mat 2.0.3x koli dvom priemyselnym kartam...
Neexistuje nahodou nejake nastavenie maximalneho poctu pending signalov? 

S vdakou za rychlu/nejaku odpoved a pozdravom

Peter Fodrek

----- Original Message ----- 
From: peter Fodrek 
To: linux na lists.linux.sk 
Sent: Thursday, June 20, 2002 11:11 AM 
Subject: [linux] Pocitanie SIGCHLD a vytvaranie "zombiekov" a teda neprijatie vsetkych SIGCHLD.PLS HLP


 
Vazeny LINUX wizards!
 
Potreboval by som pocitat prijatia SIGCHLD, ale mam problem. Urcite je "debilny", lebo viem, ze toto urcite ide.. Pred cca. 5 rokmi mi tato cinnost isla na Solaris-e... Problem vznika vtedy ak velmi blizko seba na casovej osi skoncia dve a viac "deti". Potom Zacnu vznikat zombieci a ja ich navyse neprecitam, ze skoncili, pricom "zombieci" blokuju resp. spomaluju dalsie procesy - naraz mi  ide aj 160 procesov (z toho asi 100 zombie) a po exite (kill -9 ... :)))) rodica skoncia vsetky procesy do 5s, pricom pocas behu rodica  neskoncia ani za 15  min....
Kedze viem, ze ide o nejake nastavenie pending a block masiek posielam aj cast zdrojaku, mozno toniekomu pomoze pri identifikovani tejto chyby, pretoze ja som sa asi zacyklil....

S vdakou 
 
Peter Fodrek


long ukoncenych=0,uspesnych;

/*
 obsluzna rutina SIGCHLD 
 */
void ukoncil(int sig)
{
    int statlog;
    sigset_t in,out;
    wait(&statlog);
    ukoncenych++;
    if(WIFEXITED(statlog))
    {
 uspesnych++;
    }
    
    
//    sigfillset(&in);
//    sigprocmask(SIG_UNBLOCK,&in,&out);
}

 
.........

 ukoncenych=0;
 uspesnych=0;
   struct sigaction act;
//    signal(SIGCHLD,ukoncil);
act.sa_handler=ukoncil;
// sigemtyset(&act.sa_mask);
sigfillset(&act.sa_mask);
act.sa_flags=SA_RESTART;
sigaction(SIGCHLD,&act,NULL);
//sigpending(&act.sa_mask);
.............................
do{
do{
pid=fork();
usleep(100000);
}while(pid==-1);
if(pid==0)
{
.....
exit(0);
}
spustenych++;

}while(......)

.............................
while(ukoncenych!=spustenych)
{
    usleep(100000);
    printf("blabala %ld/%ld\t blabala%ld",ukoncenych,spustenych,uspesnych);
}

 

 
------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://lists.linux.sk/pipermail/linux/attachments/20020620/2f004997/attachment.html 


Další informace o konferenci linux