代码之家  ›  专栏  ›  技术社区  ›  Pedro Silva

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

  •  2
  • Pedro Silva  · 技术社区  · 15 年前

    通过引发异常 croak 在分叉子进程中,子进程似乎会像后台进程那样打印错误。也就是说,它会重击shell提示符。

    如果我 die 呱呱叫 Carp 没有任何运气的文件。

    这就是我的意思。这个 呱呱叫

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

    这个 死亡 版本:

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

    我试着抓住那个 fork 印刷 $@ 然后退出,但没有效果。有什么想法吗?我希望能够使用 呱呱叫 在这种特殊情况下。

    虽然我的代码有点复杂,但下面是如何重现这种行为:

    $ 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.
    $
    

    解决了的: got it

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

    谢谢你的帮助!

    1 回复  |  直到 8 年前
        1
  •  3
  •   cjm    15 年前

    我很确定这只是时间问题。这个 die 版本稍微快一点,所以在shell打印下一个提示之前输出错误消息的可能性更大。当我试着运行你的例子时 croak 版本通常在提示符后打印,但有时会在提示符前打印。这个 版本总是排在提示符之前。