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',
    );
}