[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