perl在if语句中分叉进程,执行这两个块

perl在if语句中分叉进程,执行这两个块,perl,fork,Perl,Fork,当我在if条件内分叉一个新进程时,令人惊讶的是if和else块都被执行。 根据perl子例程文档,当我们执行该方法时,它会根据fork是否失败、是否成功分别返回undf、PID 下面是执行这两个块的代码 如果我的$a=叉子{ 说如果阻塞; }否则{ 说别的块; } 输出: if块 else块 其中,如果我手动返回这些,则根据我是返回0还是1,只执行一个块 子a{1;} 如果我的$a=a{ 说如果阻塞; }否则{ 说别的块; } 输出: if块 知道为什么会这样吗 根据perl fork子例程文档

当我在if条件内分叉一个新进程时,令人惊讶的是if和else块都被执行。 根据perl子例程文档,当我们执行该方法时,它会根据fork是否失败、是否成功分别返回undf、PID

下面是执行这两个块的代码

如果我的$a=叉子{ 说如果阻塞; }否则{ 说别的块; } 输出: if块 else块

其中,如果我手动返回这些,则根据我是返回0还是1,只执行一个块

子a{1;} 如果我的$a=a{ 说如果阻塞; }否则{ 说别的块; } 输出: if块

知道为什么会这样吗

根据perl fork子例程文档,当我们执行该方法时,它会根据fork是否失败、是否成功分别返回undf、PID

不完全是。它实际上是这样说的:

它将子pid返回给父进程,将0返回给子进程,如果fork不成功,则返回undef

所以

在父进程中,fork返回子进程的PID,因此父进程输出if块。 在子进程中,fork返回0,因此子进程输出else块。 通过检查返回的值,您可以让父级和子级执行不同的操作

根据perl fork子例程文档,当我们执行该方法时,它会根据fork是否失败、是否成功分别返回undf、PID

不完全是。它实际上是这样说的:

它将子pid返回给父进程,将0返回给子进程,如果fork不成功,则返回undef

所以

在父进程中,fork返回子进程的PID,因此父进程输出if块。 在子进程中,fork返回0,因此子进程输出else块。
通过检查返回的值,您可以让父级和子级执行不同的操作。

如果您还将进程ID和$$特殊变量与每个say语句一起输出,则更容易看到发生了什么:

use v5.10;

if( fork ) {
  say "$$ (parent): if block";
} else {
  say "$$ (child): else block";
}
然后,您将看到从两个不同的过程中获得输出:

19997 (parent): if block
20024 (child): else block
通常,父进程继续并完成它的工作,而子进程继续并完成您想要卸载的任何工作。但是,子级继承父级的标准文件句柄,因此输出将转到同一位置。如果您不希望这样,可以立即更改标准输出以及子级或父级中的其他输出,我想:

use v5.10;

if( fork ) {
  say "$$ (parent): if block";
} else {
  say "$$ (child): else block";
  open STDOUT, ...
}

如果希望将当前进程转换为其他进程,使您仍然只有一个进程,请查看。

如果您还将进程ID和$$特殊变量与每个say语句一起输出,则更容易看到发生了什么:

use v5.10;

if( fork ) {
  say "$$ (parent): if block";
} else {
  say "$$ (child): else block";
}
然后,您将看到从两个不同的过程中获得输出:

19997 (parent): if block
20024 (child): else block
通常,父进程继续并完成它的工作,而子进程继续并完成您想要卸载的任何工作。但是,子级继承父级的标准文件句柄,因此输出将转到同一位置。如果您不希望这样,可以立即更改标准输出以及子级或父级中的其他输出,我想:

use v5.10;

if( fork ) {
  say "$$ (parent): if block";
} else {
  say "$$ (child): else block";
  open STDOUT, ...
}

如果您希望将当前流程转变为其他流程,这样您仍然只有一个流程,请查看。

谢谢@ССаа27。我的怀疑现在清楚了;由fork执行,并表示if块;通过主流程。两者共享相同的标准。谢谢@ССаа27。我的怀疑现在清楚了;由fork执行,并表示if块;通过主进程。两者共享相同的标准输出。