我有一个调用外部程序的Perl脚本。 (现在,我实际上正在使用反引号,但我也可以轻松地使用system或cpan中的某些东西。)有时该程序失败,导致Windows创建带有文本的对话框(“(外部程序)已停止工作”)



不久替换为



不幸的是,此错误消息使进程无法终止,从而导致Perl在用户(我!)单击“取消”或“关闭程序”之前不会返回。有没有办法避免这种行为?

在我的用例中,使程序失败是可以接受的-它确实有用,但绝对不是必需的工作。但是由于它需要在无人看管的情况下运行,所以我不能让它阻止程序的其余工作。

最佳答案

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

  • 使用Win32系列中的线程和各种模块来忙于等待过程结束,或单击Dialong框。这可能是矫kill过正。
  • 当外部程序花费太长时间来响应时,使用警报信号或事件来唤醒您的程序。
  • 使用IPC模块打开程序并监视其进度。
  • 如果不需要子程序的返回值STDOUT或STDERR,则simbabque的exec选项值得,但是如果您需要保留进程的句柄,请尝试Win32::Process。我发现这在很多场合都很有用。该模块的wait方法可以很好地替代我的“警报”建议或simabque的“睡眠”建议,并具有其他好处,即您的程序的睡眠时间不会超过 child 的睡眠时间。
  • 关于windows - 如何处理失败的 `system`调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36179018/

    10-12 03:57
    查看更多