【问题标题】:Perl command line interpreter not exitingPerl 命令行解释器不退出
【发布时间】:2013-12-10 18:15:51
【问题描述】:

我在 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 只是闲置而不是退出。然后弹出窗口告诉我“Perl 命令行解释器已停止工作。”

我不太了解 Windows 中的进程管理,我之前在这个论坛上读到过使用 fork()exec() 不是一个好习惯,但是除了解释器没有关闭部分之外,代码运行良好.从尝试在 Unix 中实现程序(给出相同的错误)到使用 Win32::Process 命令,我已经尝试了所有方法——但没有任何效果。我希望可能有一个更简单的解决方案,可以让我保留我已经写的内容。

如果有人可以解释运行此代码时 Windows 中究竟发生了什么,那也将是一个帮助!

【问题讨论】:

  • fork-exec 不是 win 的好习惯,因为 win 没有针对它进行优化。 Win 是对海量线程和本地 rpc 进行了优化。但在您的情况下,这不是一个真正的问题,因为对您而言,您的包装脚本 0.001s 或 0.01s 开销产生的并不重要。如果您有例如数据库服务器守护程序或每秒必须调用数千次的东西,那么这很重要。另一件事,是的, fork()-exec() 很慢,但是 fork()-system() 甚至很慢...我看得更远,您根本没有对我的第二个问题做出反应($pid 和不是 $$)。你应该合作。

标签: windows perl winapi freeze


【解决方案1】:

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

  1. system() 创建一个子进程,因此如果您从分叉的子进程中调用 system(),您将拥有 3 个进程。但是你只杀死第二个(分叉的孩子),而不是孩子的孩子($command)。尝试使用像exec() 这样的函数,在unix 上它会在实际进程的位置(和pid)上启动子进程。如果运气好的话,Windows 上的 Perl 也会这样做。

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

【讨论】:

  • 我试验了exec(),发现它也没有退出。我会再试一次,看看会发生什么。 Windows 中的$pid 不是子进程的$pid,我认为它是一个负数,对应于“伪进程”。不知何故,我使用taskkill 的方式是功能性的,不要问我如何。谢谢
  • 我认为你的生存之道是停止盲目射击并开始用手和眼睛瞄准。
【解决方案2】:

我使用了以下内容(它使程序超时,最重要的是,它不会破坏 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;

【讨论】:

    【解决方案3】:

    在我的情况下,我删除了一些“使用”语句,它得到了解决。 这可能是因为 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多