首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在工作流树中表示fork() && fork()?

如何在工作流树中表示fork() && fork()?
EN

Stack Overflow用户
提问于 2019-11-04 08:46:43
回答 2查看 3.6K关注 0票数 1

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

当使用逻辑表达式(如&&或\)时,当我试图了解这些代码是如何工作时,它会让我感到困惑。如何用图论在树上展示它们呢?密码是怎么执行的?

代码语言:javascript
复制
#include <stdio.h> 
#include <unistd.h> 
int main() 
{ 
   fork(); 
   fork() && fork(); // or fork() || fork() 

   printf("forked\n"); 
   return 0; 
} 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-04 14:57:56

逻辑 (&&)和逻辑 (||)运算符都采用短路行为.

expr1 && expr2:如果expr1是逻辑0 (false),则不计算expr1

expr1 || expr2:如果expr1是逻辑1 (true),则不计算expr1

通过逻辑短路,只有当第一个操作数expr1没有完全确定结果时,才计算第二个操作数expr2 .

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

代码语言:javascript
复制
 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()表达式。如果你还有其他问题,请告诉我。

票数 3
EN

Stack Overflow用户

发布于 2019-11-04 08:54:40

短路评估

对于内置逻辑和运算符,如果两个操作数都为真,则结果为真.否则,结果是错误的。这个运算符是短路的:如果第一个操作数为false,则第二个操作数不进行计算。

因此,对于这一行:

代码语言:javascript
复制
fork() && fork()

第一个fork在子节点中被求值为true,子节点将再分叉一个(由于短路而完成了该语句的父级)。

相反的情况发生在:

代码语言:javascript
复制
fork() || fork()

父母会再付一次。

等效码

使用if语句编写同样的代码的方法是相同的:

代码语言:javascript
复制
if (fork()){
  fork();
}

代码语言:javascript
复制
if (!fork()){
  fork();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58689819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档