如何处理失败的`system`调用?

时间:2016-03-23 13:05:39

标签: windows perl error-handling external

我有一个调用外部程序的Perl脚本。 (现在我实际上正在使用反引号,但我可以很容易地使用system或来自cpan的东西。)有时程序失败,导致Windows创建一个对话框"(外部程序)已停止工作"与文本

  

Windows正在检查问题的解决方案......

很快被

取代
  

问题导致程序无法正常工作。如果解决方案可用,Windows将关闭程序并通知您。

不幸的是,此错误消息会阻止进程死亡,导致Perl不会返回,直到用户(我!)单击"取消"或"关闭程序"。有没有办法避免这种行为?

在我的用例中,程序失败是可以接受的 - 它确实有用但严格来说不是必要的工作。但由于它需要无人值守,我无法阻止该计划的剩余工作。

2 个答案:

答案 0 :(得分:3)

您当前的方法存在的问题是反引号&外部程序运行/挂起时system阻止。可能的其他方法可能包括。

  • 使用线程&来自Win32系列的各种模块忙于等待进程结束或单击拨号框。这可能有点过头了。
  • 当外部程序“花费太长时间”响应时,使用警报信号或事件唤醒程序。
  • 使用IPC模块打开程序并监控其进度。
  • 如果您不需要子程序的返回值,STDOUT或STDERR,则simbabque的exec选项具有优点,但如果您需要处理该过程,请尝试Win32::Process。我发现这很有用。该模块的wait方法可以替代我的警报建议或simabque的睡眠建议,并且额外的好处是您的程序睡眠时间不会超过孩子的要求。

答案 1 :(得分:0)

如果您不需要等待外部程序完成继续运行,您可以执行exec而不是system,它将永远不会返回。

您可以随后添加sleep $n以使其等待外部程序理论上完成。

exec('maybe_dies.exe');
sleep 1; # make sure it does stuff before it dies, or not, or whatever...