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

标签 windows perl error-handling external

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

Windows is checking for a solution to the problem...

很快被替换为

A problem caused the program to stop working correctly. windows will close the program and notify you if a solution is available.

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

在我的用例中,程序失败是可以接受的——它确实有用但绝对不是必要的工作。但由于它需要无人值守运行,我不能让它阻止程序的剩余工作。

最佳答案

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

  • 使用 Win32 系列的线程和各种模块忙等待进程结束或单击拨号框。这可能有点矫枉过正。
  • 当外部程序响应时间“过长”时,使用警报信号或事件唤醒您的程序。
  • 使用 IPC 模块打开程序并监控其进度。
  • 如果您不需要子程序的返回值、STDOUT 或 STDERR,simbabque 的 exec 选项很有用,但如果您需要控制进程,请尝试 Win32: :进程。我发现这在很多场合都很有用。该模块的 wait 方法可以很好地替代我的 Alarm 建议或 simabque 的 sleep 建议,还有一个好处是您的程序不会比 child 要求的 sleep 时间长。

关于windows - 如何处理失败的 `system` 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36179018/

相关文章:

python - 在Django中使用计数功能获取数据

windows - 将新文件类型添加到 Windows 7 的新上下文菜单

java - 如何从 Java EE Web 应用程序运行外部应用程序?

perl - 使用ssh在远程服务器上执行内联脚本时保护管道字符

perl - 为什么在 Perl 中将文件读入内存时会占用这么多内存?

python-3.x - Jsonify 异常错误

laravel - 在laravel中使用日志号显示生产模式下的错误

c# - 初学者如何编写 Windows GUI 程序的综合教程

c++ - 包含 <Windows.h> 后的语法错误

使用包分隔符时的 perl 字符串插值