在 Perl 中杀死一个分叉的 Windows 进程

Killing a forked Windows process in Perl

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

虽然它不起作用。进程开始,我看到 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";
}

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

该程序运行notepad编辑程序自身的源文件,并在五秒后杀死子进程。如果您需要将参数传递给命令,那么您应该将其指定为像这样的匿名值数组。如果您使用 cmd => qq<notepad "[=14=]"> 之类的单个字符串,那么您将启动 cmd.exe 的副本,而 cmd.exe 又会启动 notepad.exe,而 kill 命令将只留下记事本 运行作为孤儿

use strict;
use warnings;

use Forks::Super;

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

请注意,如果您想对子进程应用超时,那么您可以这样写

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