in reply to SIG{CHLD} altered by require statement on Perl 5.12.1

A little bit more code than needed, and some information missing.

What OS do you use? Which version? Module versions could also be interesting. I suggest to run the following script (use the download link) with both Perl versions and to post its output, wrapped in <code> tags:

#!/usr/bin/perl use strict; use warnings; use Data::Dumper; $Data::Dumper::Sortkeys=1; sub info { my $where=shift; print $where,": ",Dumper($SIG{'CHLD'}),"\n"; } info('start'); $SIG{'CHLD'}=sub { 'oh well, just a dummy' }; info('after set handler'); require Net::DNS; info('after require'); Net::DNS->import(); info('after import'); print "\n"; print "OS: $^O\n"; print "Versions:\n"; print "Perl $^V\n"; for my $fn (sort keys %INC) { my $mod=$fn; $mod=~s|/|::|g; $mod=~s|\.pm$|| or next; my $ver=do { no strict 'refs'; defined ${"$mod\::VERSION"} ? ${"$mod\::VERSION"} : 'n +one' }; print "$mod $ver\n"; }

The first lines up to print "\n" are the real test code, everything following that collects information (OS, Perl version, Module versions).

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

Replies are listed 'Best First'.
Re^2: SIG{CHLD} altered by require statement on Perl 5.12.1
by sdingare (Initiate) on Apr 14, 2015 at 22:11 UTC

    Hi there,

    Thanks for your suggestion (I think I already mentioned the OS in my first post but here it is again: Red Hat Enterprise Linux Server release 5.11; also perl -v says my perl was built for built for x86_64-linux-thread-multi)- I ran your script and here is the output I get:

    perl v5.8.8
    ---------------

    start: $VAR1 = undef; after set handler: $VAR1 = sub { "DUMMY" }; after require: $VAR1 = sub { "DUMMY" }; after import: $VAR1 = sub { "DUMMY" }; OS: linux Versions: Perl Carp 1.04 Config none Data::Dumper 2.121_08 Errno 1.0901 Exporter 5.58 Exporter::Heavy 5.58 IO 1.22 IO::Handle 1.25 IO::Select 1.17 IO::Socket 1.29 IO::Socket::INET 1.29 IO::Socket::UNIX 1.22 Net::DNS 0.66 Net::DNS::Header 704 Net::DNS::Packet 837 Net::DNS::Question 800 Net::DNS::RR 828 Net::DNS::RR::Unknown 388 Net::DNS::Resolver 830 Net::DNS::Resolver::Base 830 Net::DNS::Resolver::UNIX 482 Net::DNS::Update 517 SelectSaver 1.01 Socket 1.78 Symbol 1.06 XSLoader 0.06 bytes 1.02 constant 1.05 overload 1.04 strict 1.03 vars 1.01 warnings 1.05 warnings::register 1.01

    perl v 5.12.5
    -----------------

    start: $VAR1 = undef; after set handler: $VAR1 = sub { "DUMMY" }; after require: $VAR1 = undef; after import: $VAR1 = undef; OS: linux Versions: Perl v5.12.5 Carp 1.17 Config none Data::Dumper 2.131 Errno 1.11 Exporter 5.64_01 Exporter::Heavy 5.64_01 IO 1.25_02 IO::Handle 1.28 IO::Select 1.17 IO::Socket 1.31 IO::Socket::INET 1.31 IO::Socket::UNIX 1.23 Net::DNS 0.66 Net::DNS::Header 704 Net::DNS::Packet 837 Net::DNS::Question 800 Net::DNS::RR 828 Net::DNS::RR::Unknown 388 Net::DNS::Resolver 830 Net::DNS::Resolver::Base 830 Net::DNS::Resolver::UNIX 482 Net::DNS::Update 517 SelectSaver 1.02 Socket 1.87_01 Symbol 1.07 XSLoader 0.15 bytes 1.04 constant 1.20 overload 1.10 strict 1.04 vars 1.01 warnings 1.09 warnings::register 1.01

      Net::DNS 0.66 is really old, released before January 2012. I can't find the sources for Net::DNS 0.66 at CPAN. Consider upgrading it to the most recent version.

      As you can see from the script output, Net::DNS loads a lot of other modules, perhaps $SIG{CHLD} is deleted in one of the other modules. The following script should report where $SIG{CHLD} is modified. Run it on perl 5.12.1.

      #!/usr/bin/perl use v5.12; use strict; use warnings; package SpyHash { use Tie::Hash; # for Tie::StdHash use Carp qw( carp ); our @ISA=qw( Tie::StdHash ); sub STORE { my ($self,$key,$value)=@_; $key=~/^CH?LD$/ and carp "Assign to key $key"; return $self->SUPER::STORE($key,$value); } sub DELETE { my ($self,$key)=@_; $key=~/^CH?LD$/ and carp "Delete key $key"; return $self->SUPER::DELETE($key); } } tie %SIG,'SpyHash'; $SIG{'CHLD'}=sub { 'just a dummy' }; # this line should be reported require Net::DNS; # Any module messing with $SIG{'CHLD'} should be rep +orted from here Net::DNS->import(); # ... or here

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
        Hi there I had to modify the code you recommended I run because it was giving me the following error:
        Invalid version format (non-numeric data) at perlmonkII.pl line 7, nea +r "package SpyHash " syntax error at perlmonkII.pl line 9, near "package SpyHash {
        so I modified it to:
        use v5.12; use strict; use warnings; package SpyHash; use Tie::Hash; # for Tie::StdHash use Carp qw( carp ); our @ISA=qw( Tie::StdHash ); sub STORE{ my ($self,$key,$value)=@_; $key=~/^CH?LD$/ and carp "Assign to key $key"; return $self->SUPER::STORE($key,$value); } sub DELETE { my ($self,$key)=@_; $key=~/^CH?LD$/ and carp "Delete key $key"; return $self->SUPER::DELETE($key); } 1; package main; tie %SIG,'SpyHash'; $SIG{'CHLD'}=sub { 'just a dummy' }; # this line should be reported require Net::DNS; # Any module messing with $SIG{'CHLD'} should be rep +orted from here Net::DNS->import(); # ... or here
        Then I ran this code on perl v.12.5 and I got
        Assign to key CHLD at perlmonkII.pl line 34