> The following was supposedly scribed by
> Andy Adler
> on Thursday 26 February 2004 09:04 pm:

>> It looks like you can declare them as local(), and they should go back to
>> the defaults after you've left the block:
>
>Unfortunately, local doesn't help in this case. The interpreter is started
>in the 'use Inline Octave' and ends as perl quits. The user in this case
>wants to call system in the middle of this. Thus the IG{CHLD} handler
>is getting called when system returns.

It's not a matter of sequence, simply scope:

sub reap {
    print "reaped\n";
    die;
}

{
    local($SIG{CHLD}) = \&reap;
    $pid = fork();
    if($pid) {
        print "parent continues\n";
    }
    elsif(defined($pid)) {
        system('sleep', 3);
    }
}
system('echo', 'parent system call');
print "now parent waits\n";
waitpid($pid, WNOHANG);

So, using local() inside of your start_interpreter() block should take care of 
it.  The following should demonstrate it in it's barest form:

# this one dies:
sub reap {die "reaped"};
{
local($SIG{CHLD}) = \&reap;
system("ls");
}

# doesn't die:
sub reap {die "reaped"};
{
local($SIG{CHLD}) = \&reap;
}
system("ls");


--Eric

Reply via email to