jalebie has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I am having trouble with the following piece of code in my reaper subroutine, I am trying to keep a track of the number of child processes that have finished.
use POSIX "sys_wait_h"; use POSIX "signal_h"; ... ... ... sub reaper { my $process_id = waitpid(-1,&WNOHANG); if (WIFEXITED($?)) { $process_count--; } } $SIG{CHLD} = \&reaper;

and i get the follwong error

Argument "CHLD" isn't numeric in entersub at /usr/bin/perl/perl5.005/lib/POSIX.pm line 207.

please help
Waris

Replies are listed 'Best First'.
(tye)Re: reaper subroutines
by tye (Sage) on Aug 23, 2001 at 21:44 UTC

    Change &WNOHANG to WNOHANG() or WNOHANG and then yell at whoever taught you to use &NAME for constants in hopes that this problematic but still common practice can be stomped out.

    FYI, the reason you get this warning is that your sub reaper gets called with the name of the signal passed in to it and calling a subroutine (and constants from Perl modules are usually subroutines) with & and without parens means that the current value of @_ is reused as the arguments to that subroutine.

    So you end up doing the equivalent of WNOHANG(@_) which, in your case, is similar to WNOHANG("CHLD"). Finally, for obscure reasons, the example code for implementing constants in XS modules, allows these so-called "constants" to take an optional numeric argument. But "CHLD" isn't numeric, hence the warning.

            - tye (but my friends call me "Tye")
      Unfortunately, this culprit looks like the fine manual. The example in perlfunc (5.6.0) reads:
      use POSIX ":sys_wait_h"; #... do { $kid = waitpid(-1,&WNOHANG); } until $kid == -1;
      Worse yet, the docs for POSIX in 5.7.2 give this example:
      $pid = POSIX::waitpid( -1, &POSIX::WNOHANG ); print "status = ", ($? / 256), "\n";
      You want to submit a doc patch to p5p or should I? :)