First, never use -w flag to enable warnings; use the warnings pragma
instead.
Second, you should not exec the script directly, you don't know if it is
executable or not, and it could even wind up running under a different
version of perl. Instead, you should exec same the interpreter that is
running the current program. Happily perl stores the path to the current
interpreter in $^X for you.
It appears as if the process becomes insensitive to the SIG_ALRM signal if
you run exec within the signal handler. In general you should avoid doing
anything in a signal handler other than setting a status variable. This
code seems to work the way you were expecting:
#!/usr/bin/perl
use strict;
use warnings;
my $n = shift || 1;
my $exec = 0;
$SIG{ALRM} = sub { die "timeout\n" };
print "\$\$ is $$ this is run $n\n";
alarm 1;
eval {
sleep 5;
alarm 0;
1;
} or do {
alarm 0; # handle cases where it wasn't a timeout that died
if ($@ eq "timeout\n") {
exec $^X, $0, $n + 1;
}
};
print "should not get here\n";
What are you trying to solve with this code? Is this just academic playing
around? If not, there may be a much better solution than re-execing the
script.
On Tue, Oct 4, 2016 at 12:13 AM Unknown User <[email protected]>
wrote:
I am trying to re-exec my script after a delay. I expect that the code
below would go on re-execing indefinitely, however that does not
happen. It exits after one reexec. What should be done to make the
code re-exec forever?
$ cat exec.pl
#!/usr/bin/perl -w
use strict;
alarm(5);
$SIG{"ALRM"} = sub {
print "Reexecing\n";
exec($0,@ARGV);
};
print join(".",@ARGV);
sleep 12;
$ ./exec.pl 1 2 3 4
1.2.3.4Reexecing
1.2.3.4$
$
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/