Classification: UNCLASSIFIED Caveats: NONE I've been cutting and pasting POE code for sometime now and though I still don't understand a lot of it I've been able to use it successfully. I'm now working on a project in which I need to be able to capture the exit status of child processes. I'd really like to be able to have each child write to a shared hash or array but I'm not sure if that's possible.
I have a script that's almost line for line the POE Cookbook "Child Process 3" example. I saw the example in the FAQ for catching a child's exit status with a signal handler but I'm not sure how to apply this to my code. Specifically the hash of PIDs to wheels. $heap->{pid_to_wheel}->{ $new_wheel->PID } = $new_wheel; $heap->{id_to_wheel}->{ $new_wheel->ID } = $new_wheel; Here's an example of how I tried to implement it.... POE::Session->create ( inline_states => { _start => \&start_tasks, next_task => \&start_tasks, task_result => \&handle_task_result, task_done => \&handle_task_done, task_debug => \&handle_task_debug, task_chld => \&sigchld_handler, } ); sub start_tasks { my $heap = $_[HEAP]; while ( keys( %{ $heap->{task} } ) < MAX_CONCURRENT_TASKS ) { my $next_task = shift @tasks; last unless defined $next_task; print "Starting task for $next_task...\n"; my $task = POE::Wheel::Run->new ( Program => sub { do_stuff($next_task,@hosts) }, StdioFilter => POE::Filter::Line->new(), # Child speaks in lines. StderrFilter => POE::Filter::Line->new(), # Child speaks in lines. StdoutEvent => "task_result", StderrEvent => "task_debug", CloseEvent => "task_done", ErrorEvent => "task_chld", ); $heap->{task}->{ $task->ID } = $task; } } sub do_stuff { my $task = shift; my @hosts = @_; # The Crux foreach $host ( @hosts ) { $return_status = &main($host); if ( $return_status == 1 ) { exit 1; } } } ......... Other subs .............. sub sigchld_handler { my ( $heap, $pid, $child_error ) = @_[ HEAP, ARG1, ARG2 ]; return unless exists $heap->{pid_to_wheel}->{$pid}; my $wheel = delete $heap->{pid_to_wheel}->{$pid}; delete $heap->{id_to_wheel}->{ $wheel->ID }; print( "child process $pid exited with status ", ( $child_error >> 8 ), "\n" ); } # Run until there are no more devices. $poe_kernel->run(); Any help would be great. Classification: UNCLASSIFIED Caveats: NONE