每次调用到UNIX进程创建系统调用fork()的返回两次。首先,它返回父进程的子进程(调用fork()的进程)。其次它返回到0新创建的孩子。
从手册页:
返回值
成功时,子进程的PID返回父,并在孩子则返回0。失败时,在父项中返回-1,不创建子进程,并且适当地设置errno。
你的情况
if (fork() && !fork())
的语句中if
,叉调用两次。所以会发生什么是以下几点:
A
|----------------B
| |
|---C |
| | |
现在先请fork()
将在A和B都返回一个将是非零和B中也将是零。
到叉二()调用将仅由A.因为第一叉返回0至B,它不会唤起一个第二fork()
诱发。 其原因是&&
如果发现第一个操作数非零,则评估会短路。感谢Daniel指出了这一点。
因此,我们可以做一个表出来的这个:
PID fork()1 fork()2
------------------------------
A >0 >0
B =0 >0
C >0 =0
从图表
因此,处理C的if
将进行评估,以TRUE
其重要要记住,没有返回fork()1
到C.它得到副本已从其父母评估表达式。
我希望这能解释你的问题。
如果您编辑您的问题,并格式化你到代码段什么样的代码这将是很好 – mathematician1975 2012-07-10 20:00:12
只有'fork'返回相同的值的两倍......(有些情况下是很好的,但要注意,返回值是不同的在创建的2个过程中)。 – geoffspear 2012-07-10 20:00:28