在C中,fork()函数将返回父进程的非零值,子进程的返回值为零。
当使用逻辑表达式(如&&或\)时,当我试图了解这些代码是如何工作时,它会让我感到困惑。如何用图论在树上展示它们呢?密码是怎么执行的?
#include <stdio.h>
#include <unistd.h>
int main()
{
fork();
fork() && fork(); // or fork() || fork()
printf("forked\n");
return 0;
} 发布于 2019-11-04 14:57:56
逻辑和 (&&)和逻辑或 (||)运算符都采用短路行为.
expr1 && expr2:如果expr1是逻辑0 (false),则不计算expr1。
expr1 || expr2:如果expr1是逻辑1 (true),则不计算expr1。
通过逻辑短路,只有当第一个操作数expr1没有完全确定结果时,才计算第二个操作数expr2 .
假设父进程和子进程中的所有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()表达式。如果你还有其他问题,请告诉我。
发布于 2019-11-04 08:54:40
短路评估
对于内置逻辑和运算符,如果两个操作数都为真,则结果为真.否则,结果是错误的。这个运算符是短路的:如果第一个操作数为false,则第二个操作数不进行计算。
因此,对于这一行:
fork() && fork()第一个fork在子节点中被求值为true,子节点将再分叉一个(由于短路而完成了该语句的父级)。
相反的情况发生在:
fork() || fork()父母会再付一次。
等效码
使用if语句编写同样的代码的方法是相同的:
if (fork()){
fork();
}和
if (!fork()){
fork();
}https://stackoverflow.com/questions/58689819
复制相似问题