Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re^2: signals after exec

by tdlewis77 (Sexton)
on Aug 26, 2017 at 13:45 UTC ( [id://1198061]=note: print w/replies, xml ) Need Help??


in reply to Re: signals after exec
in thread signals after exec

./sigfail.pl
test> sig
INT: sigInt
test> loop
^CCaught
Reloading sigfail.pl
test> sig
INT: sigInt
test> loop
^C^C^C^C^C
use B; use Term::ReadLine; $SIG{INT} = \&sigInt; $term = Term::ReadLine->new("sigfail"); while ($resp = $term->readline("test> ")) { if ($resp =~ m/^exit/) { last; } elsif ($resp =~ m/^loop/) { loop: goto loop; } elsif ($resp =~ m/^reload/) { reload() } elsif ($resp =~ m/sig/) { sig() } else { print "What?\n"; } } sub codeToName { my ($coderef) = @_; my $cv = B::svref_2object($coderef); return "" unless defined($cv) && defined($cv->GV); return $cv->GV->NAME; } sub reload { print "Reloading sigfail.pl\n"; exec("./sigfail.pl") } sub sigInt { print "Caught\n"; reload() } sub sig { map { print "$_: ",codeToName($SIG{$_}),"\n" if defined($SIG{$_}) && ref($SIG{$_}) eq "CODE" } sort { $a cmp $b } keys %SIG; }

Replies are listed 'Best First'.
Re^3: signals after exec
by tdlewis77 (Sexton) on Aug 27, 2017 at 15:23 UTC

    I decided to go with using fork to invoke the reloadable code. In my final implementation the child will use require to load a bunch of code that the parent doesn't need so that when the child process terminates, that code gets unloaded. I wanted a simple way for the child to send a message on its deathbed to the parent. I considered various IPC options, but in the end decided it would be simplest to just write a message to a file. The sample code below includes verbose messaging to easily follow what's happening:

    ./sigsuccess.pl
    test> sig
    INT: sigInt
    test> loop
    ^C
    child 38021: INT
    child 38021: Reloading sigsuccess.pl
    parent 38020: ignore INT
    parent 38020: CHLD (reload)
    parent 38020: Reloading...
    test> loop
    ^C
    child 38023: INT
    child 38023: Reloading sigsuccess.pl
    parent 38020: ignore INT
    parent 38020: CHLD (reload)
    parent 38020: Reloading...
    test> exit
    child 38024: Child exiting
    parent 38020: CHLD ()
    parent 38020: exiting after waitpid

    use B; use Term::ReadLine; $SIG{INT} = sub { print "parent $$: ignore INT\n" }; my $comm = "message.$$"; reload: if ($pid = fork()) { my $reload = 0; local $SIG{CHLD} = sub { my $request = ""; if (open(my $fh,$comm)) { $request = <$fh>; chomp $request; close $fh; unlink $comm; $reload = 1 if $request =~ m/^reload$/; } print "parent $$: CHLD ($request)\n"; }; waitpid($pid,0); if ($reload) { print "parent $$: Reloading...\n"; goto reload; } print "parent $$: exiting after waitpid\n"; } else { $SIG{INT} = \&sigInt; $term = Term::ReadLine->new("sigsuccess"); while ($resp = $term->readline("test> ")) { if ($resp =~ m/^exit/) { last; } elsif ($resp =~ m/^loop/) { loop: goto loop; } elsif ($resp =~ m/^reload/) { reload(); last; } elsif ($resp =~ m/sig/) { sig() } else { print "What?\n"; } } print "child $$: Child exiting\n"; exit; } sub codeToName { my ($coderef) = @_; my $cv = B::svref_2object($coderef); return "" unless defined($cv) && defined($cv->GV); return $cv->GV->NAME; } sub reload { print "child $$: Reloading sigsuccess.pl\n"; open my $fh, ">$comm"; print $fh "reload\n"; close $fh; exit(0); } sub sigInt { print "\nchild $$: INT\n"; reload() } sub sig { map { print "$_: ",codeToName($SIG{$_}),"\n" if defined($SIG{$_}) && ref($SIG{$_}) eq "CODE" } sort { $a cmp $b } keys %SIG; }
Re^3: signals after exec
by tdlewis77 (Sexton) on Aug 26, 2017 at 15:20 UTC

    For what it's worth, this fails the same way on all of the following platforms:

    • linux 3.10.0-229.14.1.el7.x86_64
    • darwin 15.6.0
    • cygwin 2.0.4(0.28753)

    Except that CygWin doesn't print the ^C.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1198061]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (4)
As of 2024-04-25 05:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found