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