Beefy Boxes and Bandwidth Generously Provided by pair Networks RobOMonk
XP is just a number
 
PerlMonks

reaper subroutines

by jalebie (Acolyte)
 | Log in | Create a new user | The Monastery Gates | Super Search | 
 | Seekers of Perl Wisdom | Meditations | PerlMonks Discussion | 
 | Obfuscation | Reviews | Cool Uses For Perl | Perl News | Q&A | Tutorials | 
 | Poetry | Recent Threads | Newest Nodes | Donate | What's New | 

on Aug 23, 2001 at 19:40 UTC ( #107372=perlquestion: print w/ replies, xml ) Need Help??
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

Comment on reaper subroutines
Download Code
(tye)Re: reaper subroutines
by tye (Archbishop) 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? :)

Login:
Password
remember me
What's my password?
Create A New User

Node Status?
node history
Node Type: perlquestion [id://107372]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (21)
Corion
GrandFather
jdporter
toolic
holli
Gavin
atcroft
kennethk
thezip
Eyck
Perlbotics
Marshall
superfrink
ssandv
Rodster001
CColin
MikeDexter
AriSoft
johnvk
nikkadim
im2
As of 2010-02-09 21:44 GMT
Sections?
The Monastery Gates
Seekers of Perl Wisdom
Meditations
PerlMonks Discussion
Categorized Q&A
Tutorials
Obfuscated Code
Perl Poetry
Cool Uses for Perl
Perl News
Information?
PerlMonks FAQ
Guide to the Monastery
What's New at PerlMonks
Voting/Experience System
Tutorials
Reviews
Library
Perl FAQs
Other Info Sources
Find Nodes?
Nodes You Wrote
Super Search
List Nodes By Users
Newest Nodes
Recently Active Threads
Selected Best Nodes
Best Nodes
Worst Nodes
Saints in our Book
Leftovers?
The St. Larry Wall Shrine
Offering Plate
Awards
Craft
Snippets Section
Code Catacombs
Quests
Editor Requests
Buy PerlMonks Gear
PerlMonks Merchandise
Planet Perl
Perlsphere
Use Perl
Perl.com
Perl 5 Wiki
Perl Jobs
Perl Mongers
Perl Directory
Perl documentation
CPAN
Random Node
Voting Booth?

What level of existential comfort do you require?

Palace
Executive suite at the best hotel
Regular hotel in a decent part of town
Motel
Boarding house
Sleeping Bag on Couch in Basement
Any port in a storm
Camping under the freeway overpass
Jail
Other

Results (281 votes), past polls