system 对此没有太大用处。考虑使用open2,它返回已启动子进程的进程标识符。
use IPC::Open2;
# A system() like call using open2():
my $pid = open2('>&STDOUT', '<&STDIN', @CommandLine);
您现在可以在$pid 上kill 和waitpid。
这是一个使用一些老式 OOP 的示例,因此当您的程序退出时,您启动的所有进程都将自动成为 killed。我确信有现成的 perl 包以更完整的方式封装了它,但这应该会给你一个大致的想法。
#!/usr/bin/perl
use strict;
use warnings;
package mysystem;
use IPC::Open2;
sub new {
my $class=shift;
bless {
'pid' => open2('>&STDOUT', '<&STDIN', @_)
}, $class;
}
sub DESTROY {
my $self = shift;
$self->kill(15); # or whatever signal you want to send to it
$self->wait;
print "DEBUG PRINTOUT: DONE\n";
}
sub wait {
# wait for the process to terminate
my $self = shift;
waitpid($self->{pid}, 0);
}
sub kill {
# send a signal to the process
my ($self, $signal) = @_;
kill($signal, $self->{pid});
}
sub alive {
# check if the process is alive
my $self = shift;
$self->kill(0) == 1;
}
sub run {
# do like system(), start a sub process and wait for it
my $sys = new(@_);
$sys->wait;
}
package main;
sub handler {
print "Caught signal @_ - exiting\n";
exit(0);
}
$SIG{INT} = \&handler;
my $proc = mysystem->new('sleep', '1000');
print "Pid ". $proc->{pid} . " is " . ($proc->alive()?"alive":"dead") . "\n";
print "Letting the destructor kill it\n";
可能的输出:
Pid 3833402 is alive
Letting the destructor kill it
DEBUG PRINTOUT: DONE