如何处理失败的“系统”调用?
How can I handle a `system` call which fails?
我有一个调用外部程序的 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 无法 return,直到用户(我!)单击 "Cancel" 或 "Close Program"。有没有办法避免这种行为?
在我的用例中,程序失败是可以接受的——它确实有用但绝对不是必要的工作。但由于它需要 运行 无人值守,我不能让它阻止程序的剩余工作。
如果你不需要等待外部程序完成运行继续,你可以exec
instead of system
并且永远不会return。
你总是可以在之后添加一个 sleep $n
以使其等待外部程序理论上完成。
exec('maybe_dies.exe');
sleep 1; # make sure it does stuff before it dies, or not, or whatever...
您当前方法的问题是当外部程序为 running/hanging 时,反引号和 system
会阻塞。可能的其他方法可能包括。
- 使用
Win32
系列的线程和各种模块到 busy-wait 进程结束或单击拨号框。这可能有点矫枉过正。
- 当外部程序已经 'too long' 响应时,使用警报信号或事件唤醒您的程序。
- 使用 IPC 模块打开程序并监控其进度。
- 如果您不需要 child 程序的 return 值、STDOUT 或 STDERR,simbabque 的
exec
选项有其优点,但如果您需要控制进程, 尝试 Win32::Process
。我发现这在很多场合都很有用。该模块的 wait
方法可以很好地替代我的 Alarm 建议或 simabque 的睡眠建议,还有一个好处是您的程序不会比 child. 要求的睡眠时间长。
我有一个调用外部程序的 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 无法 return,直到用户(我!)单击 "Cancel" 或 "Close Program"。有没有办法避免这种行为?
在我的用例中,程序失败是可以接受的——它确实有用但绝对不是必要的工作。但由于它需要 运行 无人值守,我不能让它阻止程序的剩余工作。
如果你不需要等待外部程序完成运行继续,你可以exec
instead of system
并且永远不会return。
你总是可以在之后添加一个 sleep $n
以使其等待外部程序理论上完成。
exec('maybe_dies.exe');
sleep 1; # make sure it does stuff before it dies, or not, or whatever...
您当前方法的问题是当外部程序为 running/hanging 时,反引号和 system
会阻塞。可能的其他方法可能包括。
- 使用
Win32
系列的线程和各种模块到 busy-wait 进程结束或单击拨号框。这可能有点矫枉过正。 - 当外部程序已经 'too long' 响应时,使用警报信号或事件唤醒您的程序。
- 使用 IPC 模块打开程序并监控其进度。
- 如果您不需要 child 程序的 return 值、STDOUT 或 STDERR,simbabque 的
exec
选项有其优点,但如果您需要控制进程, 尝试Win32::Process
。我发现这在很多场合都很有用。该模块的wait
方法可以很好地替代我的 Alarm 建议或 simabque 的睡眠建议,还有一个好处是您的程序不会比 child. 要求的睡眠时间长。