Perl命令行解释器不退出

我在Windows中运行一个调用可执行文件的Perl脚本:

$command = "$path_to_exe -i $dir -o $results"; my $pid = fork(); if ( !$pid ) { system($command); #do stuff } else { #do stuff } print "Exiting..." exit; 

而不是退出后,perl.exe只是空闲。 popup窗口会告诉我“Perl命令行解释器已经停止工作”。

我对Windows中的进程pipe理了解不多,而且我之前在这个论坛上读过,使用fork()exec()并不是很好的做法,但是除了解释器没有closures部分之外,代码运行良好。 我已经尝试了一切,从尝试在Unix中执行程序(这给出了相同的错误)使用Win32::Process命令 – 但没有任何工作。 我希望有一个更简单的解决scheme,可以让我保留我已经写的东西。

如果有人能够解释这个代码在运行时到底发生了什么,那也是一个帮助!

我可以看到两个独立的问题。

  1. system()创建一个子进程,因此如果你从一个分叉的子进程调用system() ,你将有3个进程。 但是你只杀了第二个(分叉的孩子),而孩子的孩子($命令)不是。 尝试使用一些像exec()这样的函数,在unix上它会在实际进程的地方(和pid上)启动子进程。 如果你有运气,Windows上的Perl也是一样的。

  2. 在父线程中杀死$$ ,这是当前进程。 也许你想杀死$pid (这是父线程上的子进程的PID)。

我使用了下面的代码(它超时了,最重要的是,不会破坏Perl解释器!):

 use Win32::Job; my $job = Win32::Job->new; # Run $command for $max_time $job->spawn($Config{"path/cmd.exe"}, $command); $job->run($max_time); exit; 

在我的情况下,我删除了一些“使用”的声明,并得到解决。 这可能是因为Windows上“fork”的perl实现并不完美,并且导入某些“重”对象(如OLE库)时出现问题。

我删除了确切的用途:

 #use Win32::OLE qw(in with); #use Win32::OLE::Const 'Microsoft Excel'; 

解决方法:如果可能的话,尝试在代码中没有派生点之后动态导入库。

例如我的情况:

 # code with fork eval "use Win32::OLE::Const 'Microsoft Excel';"; eval "use Win32::OLE qw(in with);"; # code without fork