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; }

In reply to Re^3: signals after exec by tdlewis77
in thread signals after exec by tdlewis77

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.