sub start_child { my $Cmd = $_[0]; my $CmdOptions = $_[1]; my $ChildProc; my $ChildPid; die "cannot execute cmd: $Cmd" unless (-x "$Cmd"); require Win32::Process; Win32::Process::Create($ChildProc, $Cmd, $CmdOptions, 0, 0, ".") || confess "Could not spawn child: $!"; $ChildPid = $ChildProc->GetProcessID(); # catch early child exit, e.g. if program path is incorrect sleep(1.0); POSIX::waitpid(-1, POSIX::WNOHANG()); # clean up any defunct child process if (kill(0,$ChildPid)) { print "Started child process id $ChildPid\n"; } else { warn "Child process exited quickly: $Cmd: process $ChildPid"; } return $ChildPid; } $ChildPid = start_child($Cmd1, $Cmd1Options); sleep(5.0); $ChildPid = start_child($Cmd2, $Cmd2Options);