它被称为逻辑与运算符。这将评估两个操作数的逻辑与结果。该运算符的属性是:
首先评估左侧操作数,如果它为 TRUE(非零),则评估右侧操作数。如果它也为真,则整个表达式为真,否则为假。另一方面,如果左侧操作数为 FALSE,则根本不计算右侧操作数。可以这样做是因为,由于其中一个操作数为假,因此无论另一个操作数是什么,表达式都为假。这被称为短路
在您的代码中,如果左侧 ifret
为真,则仅评估右侧部分,最终调用fork ()
系统调用。调用的返回值与 的当前值进行“与”运算ret
,并重新分配给ret
。
基本上它的工作原理是
if (ret == TRUE)
{
retval = fork ();
ret = ret && retval;
}
读这个:
成功时,父进程返回子进程的PID,子进程返回0。失败时,在父进程中返回 -1,不创建子进程,并适当设置 errno。
考虑下面的叉树。每个树“节点”显示每个单独语句中执行语句的顺序。一项工作在一条线上。
(p1)
+--+ret = fork ();
| printf 1 shows pid
| && allows fork (), ret = 1 = pid1 && pid2
| printf 2 shows 1 +
| `if' not entered |
| show hello |
| | (p3)
| +--+ ret = 0 = ret && fork () (this is 0 here)
+-----+ printf 2 shows 0
| `if' is entered
| fork ()
| show hello
| +
| |
+ |
(p2) |
level 1 +-------+
print 0 in 1st printf |
&& DOES NOT allow fork () (p5)
print 0 in 2st printf show hello
`if' entered
fork () +-----------+
show hello |
|
+
(p4)
show hello
这是每个过程中发生的事情。
p1
执行fork ()
一次,并且在 ret 中有一个 pid(非零)。打印 pid 短路允许执行 fork()。因为这是父进程,所以它返回另一个 pid,它与前一个子 pid 相加,计算结果为 1。因此ret
现在包含 1,它在第二个 printf 中打印。与ret
1 一样,if
不执行。打印你好。
p2
p1 的孩子,所以 ret 有 0。在第一个 printf 中打印 0。短路不允许fork ()
通话。if
body 被输入并被fork ()
调用,这使得 (p4)。现在 (p2) 继续打印 Hello。
p3
p1 的子级,所以fork ()
return 为 0,与 ret 进行 AND 运算,赋值后为 0。这是在第一个 printf 之后产生的,因此只有第二个 printf 显示 0。
if
输入,fork ()
执行,这使得 (p5)。现在 p4 继续打印 Hello。
p4
从if
body 开始,出来打印 Hello
p5
从if
body 开始,出来打印 Hello
上面我已经尝试过表达进程生成树,每个进程中的工作顺序都表达在树上进程“节点”的每一行。边表示生成,边从相应的分叉处开始。