Po waitpid() _nekdy_ mam $? == -1

Jan Kasprzak kas na fi.muni.cz
Čtvrtek Říjen 1 16:23:43 CEST 2009


	Zdravim,

mam takovy problem - nevim jak dobre nasimulovat ani nevim kdy presne
nastava. Situace:

- ridici proces v Perlu, jeho ulohou je pustit az 20 potomku kteri
delaji nejake samostatne ukoly, a pokud nekteri potomci skonci
a je jeste nejaka prace, spoustet nove s novymi ukoly. Cilem je nemit
vic jak 20 bezicich procesu. Potomci jsou spousteni pomoci fork()
a jsou v tomtez procesu (obcas volaji exec(), ale to neni podstatne).
Hlavni proces ma uvnitr funkci

sub reap_children {
        my ($pause) = @_;
        my $reaped = 0;

        while ((my $pid = waitpid(-1, $pause ? 0 : WNOHANG)) > 0) {
                $reaped++;
                if ($?) {
                        syslog('notice', "Child $pid returned $?");
                }
                # After the first (possibly blocking) wait() call,
                # reap all other children in a non-blocking way.
                $pause = 0;
        }

        return $reaped;
}

- tato funkce je nekdy volana explicitne s parametrem true (bezi-li vsechny
procesy a je-li treba pockat na dokonceni aspon jednoho z nich)
anebo taky ze signalu SIGCLD:

$SIG{CLD} = sub { $nchildren -= reap_children(); };

No a ted je "problem" ze nekdy se mi do logu vypise
"Child XXXXX returned -1". Jinak ale vsechno funguje a potomci nepisou
do logu ze by se jim neco nelibilo. Od potomku je v logu posledni
hlaska za kterou v kodu nasleduje jen return z funkce, ktera je
volana z eval{} a za tim eval je exit(0);. Navic exit kod v $? je
posunuty o 8 bitu, cili -1 by tam nemela byt nikdy. Nejde snad ani
o chybu waitpid() nebo o ignorovany SIGCLD, protoze PID potomka
je vzdy vraceno (a do logu vypsano) smysluplne.

	Mam podezreni, ze -1 to vraci v pripade kdy volam variantu
bez WNOHANG, ale jisty si tim nejsem.

	Tusite nekdo proc mam v $? minus jednicku?

	Diky,

-Y.

-- 
| Jan "Yenya" Kasprzak  <kas at {fi.muni.cz - work | yenya.net - private}> |
| GPG: ID 1024/D3498839      Fingerprint 0D99A7FB206605D7 8B35FCDE05B18A5E |
| http://www.fi.muni.cz/~kas/    Journal: http://www.fi.muni.cz/~kas/blog/ |
Please don't top post and in particular don't attach entire digests to your
mail or we'll all soon be using bittorrent to read the list.     --Alan Cox


Další informace o konferenci Perl