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