在 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 })
我想生成一个进程,做一些事情,然后在完成后手动终止它。
虽然它不起作用。进程开始,我看到 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 })