poe.pl
use strict;
use warnings;
use POE qw/Wheel::Run/;
POE::Session->create(
inline_states => {
_start => sub {
my $wheel = create_wheel();
$_[HEAP]->{'wheel'} = $wheel;
$_[KERNEL]->sig_child($wheel->PID, 'on_child_signal');
},
on_child_signal => sub {
warn join '|', 'signal', @_[ARG0..ARG2];
delete $_[HEAP]->{'wheel'};
},
on_child_close => sub {
warn join '|', 'close ', $_[ARG0];
},
on_child_error => sub {
warn join '|', 'error ', @_[ARG0,ARG1,ARG2,ARG3]; #
},
on_child_stdout => sub {
warn join '|', 'stdout', @_[ARG0,ARG1]; # str, id
},
on_child_stderr => sub {
warn join '|', 'stderr', @_[ARG0,ARG1]; # str, id
},
},
);
$poe_kernel->run;
sub create_wheel {
POE::Wheel::Run->new(
Program => sub {
print STDOUT "standard message\n";
print STDERR "error message\n";
close STDOUT;
close STDERR;
exit;
},
NoSetSid => 1,
NoSetPgrp => 1,
CloseEvent => 'on_child_close',
ErrorEvent => 'on_child_error',
StdoutEvent => 'on_child_stdout',
StderrEvent => 'on_child_stderr',
);
}