use Config;
use Data::Dumper;
use Win32::Job;

my $job;
my $perlpath = $Config{perlpath};
if ($^O eq 'cygwin') {
    chomp($perlpath = `cygpath -w $perlpath`);
    $perlpath .= '.exe' if $perlpath !~ /\.exe$/;

# Processes you spawn in the job are initially suspended. You can activate
# them by using one of the following functions. This allows you to run several 
# processes in the same job.

# You can do this to run sub{} every 50 seconds until the process dies. This
# is one way to implement your own timeout, for example. The watchdog is passed
# the $job object.

my $pid;
if ($pid = fork()) {
    exit($? >> 8);
$ENV{xxyyzz} = 'fOo';

$job = Win32::Job->new;
$job->spawn($perlpath, "perl child.t", {
	stdin => 'NUL',
	stdout => 'stdout.txt',
	stderr => 'stdout.txt',
$job->spawn($perlpath, "perl -le \"print \$\$\"");
$job->spawn("cmd", q{cmd /C "echo %PATH%"});
$i = 0;
$job->watch(sub {
	print "Callback ($i / 3)\n";
	return ++$i >= 3;
}, 1);
print Dumper $job->status;
END { unlink "stdout.txt" }

# You can do this to set a hard timeout. When it expires, the process and all
# of its subprocesses will be killed. If you specify a timeout of zero, then
# you're letting it run with no timeout at all (and you might as well use a 
# simpler module).
$job = Win32::Job->new;
$job->spawn($perlpath, "perl child.t"); #, {new_console => 1});
print Dumper $job->status;
print "$^E\n";

# You can call kill() explicitly to kill the job and all of its subprocesses.
# You could do this from a watchdog timer, for example.
$job = Win32::Job->new;
$job->spawn($perlpath, "perl child.t");
print Dumper $job->status;