Author: stas
Date: Tue Dec  7 09:52:06 2004
New Revision: 110120

URL: http://svn.apache.org/viewcvs?view=rev&rev=110120
Log:
update the complicated story of signal handlers

Modified:
   perl/modperl/docs/trunk/src/docs/2.0/user/coding/coding.pod
   perl/modperl/docs/trunk/src/docs/2.0/user/troubleshooting/troubleshooting.pod

Modified: perl/modperl/docs/trunk/src/docs/2.0/user/coding/coding.pod
Url: 
http://svn.apache.org/viewcvs/perl/modperl/docs/trunk/src/docs/2.0/user/coding/coding.pod?view=diff&rev=110120&p1=perl/modperl/docs/trunk/src/docs/2.0/user/coding/coding.pod&r1=110119&p2=perl/modperl/docs/trunk/src/docs/2.0/user/coding/coding.pod&r2=110120
==============================================================================
--- perl/modperl/docs/trunk/src/docs/2.0/user/coding/coding.pod (original)
+++ perl/modperl/docs/trunk/src/docs/2.0/user/coding/coding.pod Tue Dec  7 
09:52:06 2004
@@ -464,6 +464,56 @@
 modifying the computation logic to explicitly check for the timeout at
 intervals.
 
+Talking about C<alarm()> under prefork mpm, POSIX signals seem to
+work, but require Perl 5.8.x+. For example:
+
+  use POSIX qw(SIGALRM);
+  my $mask      = POSIX::SigSet->new( SIGALRM );
+  my $action    = POSIX::SigAction->new(sub { die "alarm" }, $mask);
+  my $oldaction = POSIX::SigAction->new();
+  POSIX::sigaction(SIGALRM, $action, $oldaction );
+  eval {
+      alarm 2;
+      sleep 10 # some real code should be here
+      alarm 0;
+  };
+  POSIX::sigaction(SIGALRM, $oldaction); # restore original
+  warn "got alarm" if $@ and $@ =~ /alarm/;
+
+For more details see:
+http://search.cpan.org/dist/perl/ext/POSIX/POSIX.pod#POSIX::SigAction.
+
+One could use the C<$SIG{ALRM}> technique, working for 5.6.x+, but it
+works B<only> under DSO modperl build. Moreover starting from 5.8.0
+Perl delays signal delivery, making signals safe. This change may
+break previously working code.  For more information please see:
+http://search.cpan.org/dist/perl/pod/perl58delta.pod#Safe_Signals and
+http://search.cpan.org/dist/perl/pod/perlipc.pod#Deferred_Signals_%28Safe_Signals%29.
+
+For example if you had the alarm code:
+
+  eval {
+      local $SIG{ALRM} = sub { die "alarm" };
+      alarm 3;
+      sleep 10; # in reality some real code should be here
+      alarm 0;
+  };
+  die "the operation was aborted" if $@ and $@ =~ /alarm/;
+
+It may not work anymore. Starting from 5.8.1 it's possible to
+circumvent the safeness of signals, by setting:
+
+  $ENV{PERL_SIGNALS} = "unsafe";
+
+as soon as you start your program (e.g. in the case of mod_perl in
+startup.pl).
+
+For more information please refer to:
+http://search.cpan.org/dist/perl/pod/perl581delta.pod#Unsafe_signals_again_available
+and http://search.cpan.org/dist/perl/pod/perlrun.pod#PERL_SIGNALS.
+
+Though if you use perl 5.8.x+ it's preferrable to use the POSIX
+API technique explained earlier in this section.
 
 
 

Modified: 
perl/modperl/docs/trunk/src/docs/2.0/user/troubleshooting/troubleshooting.pod
Url: 
http://svn.apache.org/viewcvs/perl/modperl/docs/trunk/src/docs/2.0/user/troubleshooting/troubleshooting.pod?view=diff&rev=110120&p1=perl/modperl/docs/trunk/src/docs/2.0/user/troubleshooting/troubleshooting.pod&r1=110119&p2=perl/modperl/docs/trunk/src/docs/2.0/user/troubleshooting/troubleshooting.pod&r2=110120
==============================================================================
--- 
perl/modperl/docs/trunk/src/docs/2.0/user/troubleshooting/troubleshooting.pod   
    (original)
+++ 
perl/modperl/docs/trunk/src/docs/2.0/user/troubleshooting/troubleshooting.pod   
    Tue Dec  7 09:52:06 2004
@@ -344,61 +344,10 @@
 
 
 
+=head2 Problems with Catching Signals
 
-=head2 Problems with Catching Signals under Perl 5.8.x+
-
-Starting from 5.8.0 Perl delays signal delivery, making signals
-safe. This change may break previously working code.  For more
-information please see:
-http://search.cpan.org/dist/perl/pod/perl58delta.pod#Safe_Signals and
-http://search.cpan.org/dist/perl/pod/perlipc.pod#Deferred_Signals_%28Safe_Signals%29
-
-For example if you had the alarm code:
-
-  eval {
-      local $SIG{ALRM} = sub { die "alarm" };
-      alarm 3;
-      sleep 10; # in reality some real code should be here
-      alarm 0;
-  };
-  die "the operation was aborted" if $@ and $@ =~ /alarm/;
-
-It may not work anymore. Starting from 5.8.1 it's possible to
-circumvent the safeness of signals, by setting:
-
-  $ENV{PERL_SIGNALS} = "unsafe";
-
-as soon as you start your program (e.g. in the case of mod_perl in
-startup.pl).
-
-For more information please refer to:
-http://search.cpan.org/dist/perl/pod/perl581delta.pod#Unsafe_signals_again_available
-and http://search.cpan.org/dist/perl/pod/perlrun.pod#PERL_SIGNALS
-
-But most likely this is not what you want (since that circumvention
-makes your code unsafe). The proper solution that works correctly
-across all 5.8.x+ versions is to use the POSIX signal handling, which
-bypasses perl signal mechanism. Our example should be rewritten as
-follows:
-
-  use POSIX qw(SIGALRM);
-  eval {
-      POSIX::sigaction(SIGALRM,
-                       POSIX::SigAction->new(sub { die "alarm" }))
-            or die "Error setting SIGALRM handler: $!\n";
-      alarm 3;
-      sleep 10; # in reality some real code should be here
-      alarm 0;
-  };
-  die "the operation was aborted" if $@ and $@ =~ /alarm/;
-
-For more details see:
-http://search.cpan.org/dist/perl/ext/POSIX/POSIX.pod#POSIX::SigAction
-
-
-
-
-
+See L<Using Signal
+Handlers|docs::2.0::user::coding::coding/Using_Signal_Handlers>.
 
 
 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to