ctrl-c gives a INT signal which is captured by the sub below. When the
ctrl-c is captured, the code will kill the job with signal TERM, this should
generate a SIGCHLD and make the wheel to exit, not in  the state of
"zombie".

sub read_from {
    my ($input, $exception) = @_[ARG0, ARG1];
    my $console = $_[HEAP]->{stdin};
    my $job     = $_[HEAP]->{job};
    unless (defined $input) {
        $console->put("Exception got, existing....");
        $job && $job->kill();
        return;
    }
    $_[HEAP]->{stdin}->put("got: $input");
    $_[HEAP]->{job}->put($input);
}

2009/9/28 Olivier Mengué <olivier.men...@gmail.com>

>
> > *POE::Kernel::USE_SIGCHLD = sub (){1};
>
> If you want this line to be effective, you have to put it ABOVE the "use
> POE" line.
> And it is better written that way:
> sub POE::Kernel::USE_SIGCHLD { 1 }
> The way you wrote it would be less efficient as I expect the function would
> not be inlined as a constant.
>
>
> > Below is my code. If I input CTRL-C when the script asking for a username
> or
> > password, the script dose not exit even if I use $SIG{CHLD}='IGNORE'. By
> 'ps
> > -ef', I can see that the get_name.pl is in the state of  "zombie" and
> > waiting for the parent process to reap.
>
> CTRL+C gives SIGBREAK, not SIGCHLD.
> You are correctly handling SIGCHLD in on_child_signal, except, as Nick
> pointed:
>    $_[KERNEL]->sig_child($pid, 'got_child_signal');
>
> You should add a SIGBREAK handler in on_start:
>  $poe_kernel->sig(BREAK => 'on_sig_term');
>  $poe_kernel->sig(TERM => 'on_sig_term');
>
> sub on_sig_term
> {
>   if (exists $_[HEAP]->{job}) {
>     $_[HEAP]->{job}->kill();
>     delete $_[HEAP]->{job};
>   }
>   delete $_[HEAP]->{stdin};
>   $poe_kernel->sig_handled();
> }
>
> Olivier.
>
>


-- 
Woosley.Xu
Tju->PMO->Rdps

Reply via email to