从BEGIN块中调用Perl fork

jpa*_*cek 7 perl posix fork

fork在从BEGIN块中调用Perl时,我无法理解Perl中的行为.在perlfork中,我读到了这个

BEGIN块

fork()BEGIN块内调用时,仿真将无法完全正常工作.分叉副本将运行BEGIN块的内容,但不会在BEGIN块之后继续解析源流.例如,请考虑以下代码:

BEGIN {
    fork and exit;      # fork child and exit the parent
    print "inner\n";
}
print "outer\n";
Run Code Online (Sandbox Code Playgroud)

这将打印:

inner
Run Code Online (Sandbox Code Playgroud)

而不是预期的:

inner
outer
Run Code Online (Sandbox Code Playgroud)

但是,正如我所读到的,这仅适用于fork模拟的平台.既然我关心(并测试代码)Linux,那应该不是问题,不是吗?

实际上,如果我从该文档中复制示例代码

BEGIN {
    fork and exit;
    print "inner\n";
}
print "outer\n";
Run Code Online (Sandbox Code Playgroud)

这就是我运行它时会发生的事情

jirka@debian:~/xpath$ perl /tmp/test.pl
jirka@debian:~/xpath$ inner
outer
Run Code Online (Sandbox Code Playgroud)

这似乎是一致的.

但是,当我删除时,exit我希望同时拥有父进程和子进程.那不符合我的预期.

这是我的新代码

BEGIN {
    fork;
    print "inner\n";
}
print "outer\n";
Run Code Online (Sandbox Code Playgroud)

这是奔跑

jirka@debian:~/xpath$ perl /tmp/test.pl
inner
outer
jirka@debian:~/xpath$ inner
Run Code Online (Sandbox Code Playgroud)

我期待两个inner和两个outer.第二个outer缺失.

我的问题是,是什么导致了这种奇怪的行为,甚至如何描述它.

yst*_*sth 3

在我看来,子进程不再打开源文件(或者它仅在父进程中缓冲?)

通过 -e 尝试代码成功。