perl - 如何将 fork 子进程中的 croak 抛出的异常传播到父进程/前台进程?

标签 perl exception fork

在 fork 子进程中通过 croak 抛出异常似乎会像后台进程一样打印错误。也就是说,它破坏了 shell 提示符。

如果我die而不是croak,错误消息会作为前台进程弹出。我试图找出 Carp 文档中的原因,但没有成功。

这就是我的意思。 croak 版本:

$ perl Wrapper.pm
$ error: ... does not exist at Wrapper.pm line 624

die 版本:

$ perl Wrapper.pm
error: ... does not exist at Wrapper.pm line 515.

我 try catch fork并将$@打印到STDERR并退出,但这没有效果。有任何想法吗?我希望能够在这种特殊情况下使用 croak

虽然我的代码相当复杂,但您可以通过以下方式重现此行为:

$ perl -MCarp -e 'unless (fork) {croak "child"}'
$ child at -e line 1
  <- cursor blinking here. Pressing enter gives me a new prompt:
$

$ perl -e 'unless (fork) {die "child"}'
child at -e line 1.
$

已解决: cjm got it :

$ perl -e '$SIG{__DIE__} = sub {sleep 1}; unless (fork) {die "child"}'
$ child at -e line 1.

感谢您的帮助!

最佳答案

我很确定这只是一个时间问题。 die 版本稍快一些,因此它有更好的机会在 shell 打印下一个提示之前输出错误消息。当我尝试运行您的示例时,croak 版本通常会在提示之后打印,但有时会在提示之前打印。 die 版本非常一致地出现在提示之前。

关于perl - 如何将 fork 子进程中的 croak 抛出的异常传播到父进程/前台进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2947727/

相关文章:

linux - 如何将参数传递给 perl 脚本

arrays - 如何循环遍历 Perl 哈希数组数组?

html - 检测HTML5段落结尾-与HTML序列化相关

c++ - 请求致命程序退出 (ucrtbase.dll)

linux - 进程描述符是如何初始化的

c - 使用 open() 和 mmap() 在进程之间共享文本文件

perl - Perl 5 的最佳 IDE

python - Twisted Deferred 在没有 errback 的情况下不显示未处理的异常

delphi - 在delphi 7中, `try ... except raise; end;`有意义吗?

c++ - fork 进程有问题