在Perl中杀死分叉的Windows进程

时间:2015-04-24 11:41:05

标签: windows multithreading perl fork kill

我想生成一个进程,做一些事情,然后在我完成后手动杀死它。

虽然它不起作用。该过程开始,我看到pid和while循环一直运行,直到我杀了它。

可能是,Perl会生成一个新shell,然后生成UI进程,当shell(Perl生成的)被杀死时,它不会被Perl杀死?

my $cmd = "notepad.exe";
my $sleepTime = 10;#60 * 10;

$childPid = fork(); 
if ($childPid)
{ # Parent
  print "Started child process id: $childPid\n";
  sleep $sleepTime;

  $SIG{CHLD} = 'IGNORE';
  while (kill(15, $childPid))
  {
    my $numKilled = kill(SIGTERM, $childPid);
    printf("numKilled: %s\n", $numKilled);
    printf("numKilled: %s\n", $childPid);
    sleep 1;
  }
}

elsif ($childPid == 0)
{ # Child
  system($cmd);
  exit 0;  # will never get here
}
else
{ # Unable to fork
  die "ERROR: Could not fork new process: $!\n\n";
}

1 个答案:

答案 0 :(得分:1)

Forks::Super模块为处理分叉进程提供了许多有用的工具,并提供了更便携的界面。

此程序运行notepad以编辑程序自己的源文件,并在五秒后终止子进程。如果需要将参数传递给命令,则应将其指定为像这样的匿名数组。如果你使用像cmd => qq<notepad "$0">这样的单个字符串,那么你将启动cmd.exe的副本,而cmd.exe又会启动notepad.exe,而kill命令只会让记事本作为孤儿运行

use strict;
use warnings;

use Forks::Super;

if ( my $pid = fork({ cmd => [ 'notepad', $0 ] }) ) {
  sleep 5;
  Forks::Super::kill('TERM', $pid);
  print "Killed\n";
}

请注意,如果要对子进程应用超时,则可以编写

my $pid = fork({ cmd => 'notepad', timeout => 600 })