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

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

Replies are listed 'Best First'.
Re^3: SIG{CHLD} altered by require statement on Perl 5.12.1
by afoken (Chancellor) on Apr 15, 2015 at 00:28 UTC

    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

        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 {

        Yepp, sorry, that's v5.14 syntax.

        Then I ran this code on perl v.12.5 and I got

        Assign to key CHLD at perlmonkII.pl line 34

        So, it seems that Net::DNS does not modify $SIG{CHLD}. Or it does modify it so far behind the scenes that tie magic does not catch it.

        Are you sure that your code does not mess with $SIG{CHLD}? Search all your sources for CHLD or $SIG.

        Let's assume your code is clean. I added some calls to Data::Dumper to that code to verify the value of $SIG{CHLD}. Could you try that script? Comment out the tie %SIG,'SpyHash'; line and run again, so that we can see if tie has any effects.

        #!/usr/bin/perl use v5.12; use strict; use warnings; use Data::Dumper; 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; sub info { my $where=shift; print $where,": ",Dumper($SIG{'CHLD'}),"\n"; } info('start'); tie %SIG,'SpyHash'; info('after tie'); $SIG{'CHLD'}=sub { 'just a dummy' }; # this line should be reported info('after set handler'); require Net::DNS; # Any module messing with $SIG{'CHLD'} should be rep +orted from here info('after require'); Net::DNS->import(); # ... or here info('after import'); # For some extra paranoia, pretend to do some work with Net::DNS: my $dns=Net::DNS::Resolver->new(); info('after creating instance'); my $reply=$dns->search('localhost'); info('after resolving localhost'); $reply=$dns->search('no.such.host.anywhere.invalid.'); info('after resolving junk');

        Alexander

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