SYNOPSIS

#!/usr/bin/perl

use warnings;
use strict;

use POE qw( Wheel::Run::Win32 );

POE::Session->create(
  inline_states => {
    _start           => \&on_start,
    got_child_stdout => \&on_child_stdout,
    got_child_stderr => \&on_child_stderr,
    got_child_close  => \&on_child_close,
    got_child_signal => \&on_child_signal,
  }
);

POE::Kernel->run();
exit 0;

sub on_start {
  my $child = POE::Wheel::Run::Win32->new(
    Program => [ "/bin/ls", "-1", "/" ],
    StdoutEvent  => "got_child_stdout",
    StderrEvent  => "got_child_stderr",
    CloseEvent   => "got_child_close",
  );

  $_[KERNEL]->sig_child($child->PID, "got_child_signal");

  # Wheel events include the wheel's ID.
  $_[HEAP]{children_by_wid}{$child->ID} = $child;

  # Signal events include the process ID.
  $_[HEAP]{children_by_pid}{$child->PID} = $child;

  print(
    "Child pid ", $child->PID,
    " started as wheel ", $child->ID, ".\n"
  );
}

# Wheel event, including the wheel's ID.
sub on_child_stdout {
  my ($stdout_line, $wheel_id) = @_[ARG0, ARG1];
  my $child = $_[HEAP]{children_by_wid}{$wheel_id};
  print "pid ", $child->PID, " STDOUT: $stdout_line\n";
}

# Wheel event, including the wheel's ID.
sub on_child_stderr {
  my ($stderr_line, $wheel_id) = @_[ARG0, ARG1];
  my $child = $_[HEAP]{children_by_wid}{$wheel_id};
  print "pid ", $child->PID, " STDERR: $stderr_line\n";
}

# Wheel event, including the wheel's ID.
sub on_child_close {
  my $wheel_id = $_[ARG0];
  my $child = delete $_[HEAP]{children_by_wid}{$wheel_id};

  # May have been reaped by on_child_signal().
  unless (defined $child) {
    print "wid $wheel_id closed all pipes.\n";
    return;
  }

  print "pid ", $child->PID, " closed all pipes.\n";
  delete $_[HEAP]{children_by_pid}{$child->PID};
}

sub on_child_signal {
  print "pid $_[ARG1] exited with status $_[ARG2].\n";
  my $child = delete $_[HEAP]{children_by_pid}{$_[ARG1]};

  # May have been reaped by on_child_close().
  return unless defined $child;

  delete $_[HEAP]{children_by_wid}{$child->ID};
}

DESCRIPTION

POE::Wheel::Run::Win32 executes a program or block of code in a subprocess. The parent process may exchange information with the child over the child's STDIN, STDOUT and STDERR filehandles.

It is basically a shim around POE::Wheel::Run, since all the code that did live here has been now merged into that.

AUTHORS & COPYRIGHTS

Please see POE for more information about authors and contributors.