The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Config;
use Data::Dumper;
use Win32::Job;

my $job;

# 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.
$job = Win32::Job->new;
$job->spawn($Config{perlpath}, "perl child.t", {
	stdin => 'NUL',
	stdout => 'stdout.txt',
	stderr => 'stdout.txt',
});
$job->spawn($Config{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($Config{perlpath}, "perl child.t"); #, {new_console => 1});
$job->run(10);
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($Config{perlpath}, "perl child.t");
$job->run(1);
print Dumper $job->status;