perl在if语句中分叉进程,执行这两个块
当我在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块。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子例程文档
通过检查返回的值,您可以让父级和子级执行不同的操作。如果您还将进程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块;通过主进程。两者共享相同的标准输出。