Branch: refs/heads/blead
Home: https://github.com/Perl/perl5
Commit: 37f34a4f18f0b069e5274462e3cd5d5c19a78086
https://github.com/Perl/perl5/commit/37f34a4f18f0b069e5274462e3cd5d5c19a78086
Author: Štěpán Němec <[email protected]>
Date: 2024-08-01 (Thu, 01 Aug 2024)
Changed paths:
M pod/perlipc.pod
Log Message:
-----------
perlipc.pod: fix the "exec from signal handler" example
This is a partial revert of de7ba5179657 ("Doc patch to
perlipc", 2011-09-11).
I tested both the pre-de7ba5179657 and current version of
the example program (section "Handling the SIGHUP Signal in
Daemons") on Arch Linux (perl v5.38.2 built for x86_64-linux-thread-multi)
and OpenBSD -current (perl v5.36.3 built for amd64-openbsd).
On both systems, the handler is called only once with the
current (broken) version of the example program.
With the pre-de7ba5179657 version the handler is called on
every delivery of the signal, as expected.
POSIX shell test script (perlipc-sighandler.sh):
================================================
-->8--
#!/bin/sh
check() {
printf '\nTesting %s\n' "$*"
"$@" &
sleep 1
kill -HUP $!
sleep 1
kill -HUP $!
sleep 1
kill $!
}
bad=./perlipc-sighandler-bad.perl
good=./perlipc-sighandler-good.perl
# from current perlipc.pod (perl5 commit e78caca8144e v5.39.9-35-ge78caca8144e)
cat <<\EOF >"$bad"
#!/usr/bin/perl
use v5.36;
use POSIX ();
use FindBin ();
use File::Basename ();
use File::Spec::Functions qw(catfile);
$| = 1;
# make the daemon cross-platform, so exec always calls the script
# itself with the right path, no matter how the script was invoked.
my $script = File::Basename::basename($0);
my $SELF = catfile( $FindBin::Bin, $script );
# POSIX unmasks the sigprocmask properly
$SIG{HUP} = sub {
print "got SIGHUP\n";
exec( $SELF, @ARGV ) || die "$0: couldn't restart: $!";
};
code();
sub code {
print "PID: $$\n";
print "ARGV: @ARGV\n";
my $count = 0;
while (1) {
sleep 2;
print ++$count, "\n";
}
}
EOF
# from perlipc.pod before perl5 commit de7ba5179657 v5.15.2-343-gde7ba5179657
cat <<\EOF >"$good"
#!/usr/bin/perl
use v5.36;
use POSIX ();
use FindBin ();
use File::Basename ();
use File::Spec::Functions qw(catfile);
$| = 1;
# make the daemon cross-platform, so exec always calls the script
# itself with the right path, no matter how the script was invoked.
my $script = File::Basename::basename($0);
my $SELF = catfile( $FindBin::Bin, $script );
# POSIX unmasks the sigprocmask properly
my $sigset = POSIX::SigSet->new();
my $action = POSIX::SigAction->new("sigHUP_handler",
$sigset,
&POSIX::SA_NODEFER);
POSIX::sigaction(&POSIX::SIGHUP, $action);
sub sigHUP_handler {
print "got SIGHUP\n";
exec( $SELF, @ARGV ) || die "$0: couldn't restart: $!";
}
code();
sub code {
print "PID: $$\n";
print "ARGV: @ARGV\n";
my $count = 0;
while (1) {
sleep 2;
print ++$count, "\n";
}
}
EOF
chmod +x "$bad" "$good"
check "$bad"
check "$good"
-->8--
Example observed output:
========================
; ./perlipc-sighandler.sh
Testing ./perlipc-sighandler-bad.perl
PID: 19120
ARGV:
got SIGHUP
PID: 19120
ARGV:
Testing ./perlipc-sighandler-good.perl
PID: 19980
ARGV:
got SIGHUP
PID: 19980
ARGV:
got SIGHUP
PID: 19980
ARGV:
Cc: Leon Timmermans <[email protected]>
Fixes: de7ba5179657 ("Doc patch to perlipc")
Commit: 37d9b9c0bb48b00900b977532e86fdd99e577df0
https://github.com/Perl/perl5/commit/37d9b9c0bb48b00900b977532e86fdd99e577df0
Author: Štěpán Němec <[email protected]>
Date: 2024-08-01 (Thu, 01 Aug 2024)
Changed paths:
M pod/perlipc.pod
Log Message:
-----------
perlipc.pod: improve "exec from signal handler" signal mask comment
"POSIX unmasks the sigprocmask properly" seems rather opaque.
Instead, explain the SA_NODEFER motivation directly.
Commit: 6cc5fbb9234d1f71fc32008ff15b82b4c7e80822
https://github.com/Perl/perl5/commit/6cc5fbb9234d1f71fc32008ff15b82b4c7e80822
Author: Štěpán Němec <[email protected]>
Date: 2024-08-01 (Thu, 01 Aug 2024)
Changed paths:
M AUTHORS
Log Message:
-----------
Update AUTHORS (add stepnem)
Commit: 9b9c0391a41918597cf73b1318bbec469b46aaa5
https://github.com/Perl/perl5/commit/9b9c0391a41918597cf73b1318bbec469b46aaa5
Author: Štěpán Němec <[email protected]>
Date: 2024-08-01 (Thu, 01 Aug 2024)
Changed paths:
M pod/perlipc.pod
Log Message:
-----------
perlipc.pod: avoid race in "exec from signal handler" example
Instead of using SA_NODEFER, which makes the handler
function itself interruptible by another SIGHUP, use
a plain $SIG{HUP} handler and unblock SIGHUP using
sigprocmask from the main program.
Compare: https://github.com/Perl/perl5/compare/9cca022465b6...9b9c0391a419
To unsubscribe from these emails, change your notification settings at
https://github.com/Perl/perl5/settings/notifications