短路评估
对于内置逻辑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