如何在树中表示fork()&& fork()?

在C中,fork()函数将为父进程返回一个非零值,为子进程返回一个零。

在使用&&或||之类的逻辑表达式时,当试图了解这些代码如何工作时,我感到困惑。如何通过图论在树中显示它们?代码是如何执行的?

#include <stdio.h> 
#include <unistd.h> 
int main() 
{ 
   fork(); 
   fork() && fork(); // or fork() || fork() 

   printf("forked\n"); 
   return 0; 
} 
axingweb 回答:如何在树中表示fork()&& fork()?

短路评估

  

对于内置逻辑AND运算符,如果两者都为真,则结果为true   操作数是正确的。否则,结果为假。这个运算子是   短路:如果第一个操作数为假,则第二个操作数为   没有评估

对于这一行:

fork() && fork()

在子级中对第一个fork进行评估,true,子级将再叉一个(由于短路,父级已完成此语句)。

与之相反的是:

fork() || fork()

然后父母会再叉一个。

等效代码

等效的书写方式是使用if语句:

if (fork()){
  fork();
}

if (!fork()){
  fork();
}
,

逻辑 AND &&)和逻辑 OR ||)运算符均采用短路行为。

expr1 && expr2:如果expr2是逻辑expr1 false ),则不会评估0
expr1 || expr2:如果expr2是逻辑expr1 true ),则不会评估1

由于逻辑短路,只有当第一个操作数expr2不能完全确定结果时,才对第二个操作数expr1进行评估。

>

假设父流程和子流程中的所有fork()调用均成功,则分叉的流程树将如下所示:

 parent process
     |
     |
   fork()    // first fork
   -----     // below in the tree,RV is fork() returned value
     |
     |----child process [RV: 0]--
     |                          |
   [RV: child PID]              |
     |                          |
   fork() && fork()            fork() && fork()
   ------                      ------
     |                          |
     |                          |--child process [RV: 0]--
     |                          |                        |
     |                         [RV: X (child PID)]       |
     |                          |                      0 && fork()   
     |                          |                   // due to && short-circuiting behavior,|                          |                   // fork() will not be called
     |                          |                        |
     |                          |                       Print "forked"
     |                          |                       Exit
     |                          |
     |                          |
     |                    X && fork()   // X is a non zero value and hence the fork() will be called
     |                         ------
     |                          |
     |                          |--child process [RV: 0]--
     |                          |                        |
     |                        [RV: child PID]            |
     |                          |                        |
     |                         Print "forked"           Print "forked"
     |                         Exit                     Exit
     |
     |--child process [RV: 0]--
     |                        |
   [RV: X (child PID)]        |
     |                      0 && fork()
     |                      // due to && short-circuiting behavior,fork() will not be called
     |                        |
     |                        |
     |                      Print "forked"
     |                      Exit
     |
X && fork()   // X is a non zero value and hence the fork() will be called
     ------
     |
     |--child process [RV: 0]--
     |                        |
   [RV: child PID]            |
     |                        |
     |                        |
   Print "forked"           Print "forked"
   Exit                     Exit

我希望这将有助于您了解执行情况。尝试表达fork() || fork()。如果您还有其他问题,请告诉我。

本文链接:https://www.f2er.com/3168131.html

大家都在问