[linux] Pocitanie SIGCHLD a vytvaranie "zombiekov" a teda neprijatie vsetkych SIGCHLD.PLS HLP
peter Fodrek
fodrek na kasr.elf.stuba.sk
Čtvrtek Červen 20 11:11:28 CEST 2002
Vazeny kolegovia!
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/bd241c60/attachment.html
Další informace o konferenci linux