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

Honza Pazdziora adelton na fi.muni.cz
Pátek Říjen 2 09:03:23 CEST 2009


On Thu, Oct 01, 2009 at 04:23:43PM +0200, Jan Kasprzak wrote:
> 	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.

Kdy volas variantu bez WNOHANG, tedy s $pause true, tedy volano ne
z toho signal handleru, ze?

Man perlvar rika:

	If you have installed a signal handler for "SIGCHLD",
	the value of $? will usually be wrong outside that handler.

Neni to Tvuj pripad?

-- 
--------------------------------------------------------------------------
  Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
.project: Satellite, Spacewalk | Only self-confident people can be simple.


Další informace o konferenci Perl