2017-02-10 56 views
1

我不明白fork() & fork()fork() && fork()之间有什么区别。我也为他们获得不同的输出。关于fork()系统调用中的混淆C

fork() & fork(); 
printf("hi\n"); 

Output : hi 
hi 
hi 
hi 

fork() && fork(); 
printf("hi\n"); 

Output: hi 
hi 
hi 

谁能请解释一下什么怎么回事。这是编译器的问题吗? (我在ubuntu14上使用gcc)

+0

我会解决这个问题的方法是首先通过查找关于C操作符的资源来学习'&'和'&&'之间的区别。然后,我将通过阅读POSIX规范或Linux man手册来了解'fork'的功能。 –

回答

3

一个是做逻辑测试,另一个是做一个按位和结果。

fork() && fork() 

这将分叉。在父项中,它将再次分叉,因为第一个分支的计算结果为非零值(pid),而在子项中则不会。

fork() & fork() 

父和子都会分叉,因为这会执行按位分隔以及分叉的返回值(PID或零)。

1

fork() && fork()第一叉返回0。这意味着假等等&&子句的其余部分的评价被放弃(这将是假无论该条的其余部分的值的)

&版本始终计算(执行)双方

它像

if (x != null && x->foo == 42) 
    printf("42"); 

第二部分(富== 42)如果第一部分(X!= NULL)是假的没有被触及

0

这是由于&&运营商的short-circuit evaluation属性。基本上,对于任何表达x && y,x首先被评估。如果结果为false,y根本没有评估,并且整个表达式评估为false。否则,结果是评估y,如果需要,将其转换为布尔值。因此,例如,false && printf("Is this evaluated?\n")将不会打印任何内容。

这意味着fork() && fork()将首先评估第一个fork(),并且当且仅当第一个结果为非零结果时评估第二个。在fork()函数的特定情况下,这只发生在父进程中,因为子进程获得0返回状态。因此,原始父母分叉两次,但孩子不分。结果是只会产生三个进程。

另一方面,&算子没有短路评估,因为它不是逻辑与,而是按位与。由于&不是关于布尔值,而是关于位(与&&不同),所以始终评估两个参数。这意味着在fork() & fork()的情况下,父母将分叉两次,并且第一个孩子将再次分叉,导致四个不同的过程。

顺便说一句,你应该学习C语言,而不是直接跳到fork()。如果你使用的工具,你不明白这样的问题会回来经常困扰你。