我正在尝试编写一个执行外部程序并停止它的 perl 脚本。
外部程序不会自行停止,因为我应该在它运行的命令 shell 上按“输入”。
有什么办法可以在 perl 脚本中停止外部程序?
我正在尝试编写一个执行外部程序并停止它的 perl 脚本。
外部程序不会自行停止,因为我应该在它运行的命令 shell 上按“输入”。
有什么办法可以在 perl 脚本中停止外部程序?
有什么办法可以在 perl 脚本中停止外部程序?
一句话,是的。但实现取决于您运行应用程序的平台。
在 perl 支持的所有平台上,您都可以system()
用来调用外部程序。但是然后您的原始程序将等待并且不执行任何操作,直到外部程序退出,因此system()
不适合您的情况。
由于您没有提及您的平台(OS),因此这里应该讨论两个主要平台:
类Unix操作系统:首先你可以fork
有一个子进程,在子进程中,exec
用来调用外部程序。然后在父进程中,您可以等待子进程,并TERM
在您想停止外部程序时向其发送信号(或默认终止进程的其他信号)。
if (($pid = fork) == 0) {
exec("$external_program $arg");
} else {
# do something...
kill "TERM", $pid;
}
Win32 OS:我想提一下,在Win32平台上,子进程fork
ed实际上是一个伪进程,Win32不像Unix那样支持信号方法。您可以按照1
Win32 中的解决方案进行操作,但据我尝试,子进程经常会错过信号,例如,当子进程正在睡眠或等待套接字连接时。这可能非常不稳定。
相反,Win32::Process是一个更好的解决方案。它使用 Win32 API 来创建和操作进程。
use Win32::Process;
use Win32;
Win32::Process::Create($ProcessObj, $external_program, $arg,
0, NORMAL_PRIORITY_CLASS, ".") or die;
# do something ...
$ProcessObj->Kill($exitcode);
基本上就是这个原理。如果你想要一个跨平台的解决方案,CPAN 上有一个模块Proc::Background,它支持两个平台。
use Proc::Background;
my $proc = Proc::Background->new($command, $arg);
# do something ...
$proc->die;