我不明白fork() & fork()
和fork() && fork()
之间的区别。我也得到了不同的输出。
fork() & fork();
printf("hi\n");
Output : hi
hi
hi
hi
fork() && fork();
printf("hi\n");
Output: hi
hi
hi
任何人都可以解释一下这里发生的事情。这是关于编译器的问题吗? (我在ubuntu14上使用gcc)
答案 0 :(得分:3)
一个是进行逻辑测试,另一个是按位进行结果。
fork() && fork()
这会分叉。在父级中,它将再次分叉,因为第一个fork计算为非零值(pid),而在子级中它不会。
fork() & fork()
父和子都将分叉,因为它执行按位和fork的返回值(PID或零)。
答案 1 :(得分:1)
在fork() && fork()
中第一个fork返回0.这意味着false,因此放弃了&&
子句的其余部分的评估(无论子句其余部分的值如何,它都将为false )
&
版本始终评估(执行)双方
就像
if (x != null && x->foo == 42)
printf("42");
如果第一部分(x!= null)为假,则不触及第二部分(foo == 42)
答案 2 :(得分:1)
这是由&&
运算符的short-circuit evaluation属性引起的。基本上,对于任何表达式x && y
,首先评估x
。如果结果为false
,则根本不评估y
,整个表达式的计算结果为false
。否则,结果是评估y
的结果,必要时作为布尔值转换。因此,例如,false && printf( "Is this evaluated?\n" )
将不会打印任何内容。
这意味着fork() && fork()
将首先评估第一个fork()
,并且当且仅当第一个结果导致非零结果时才评估第二个fork()
。在0
函数的特定情况下,这仅发生在父进程中,因为子进程获得&
返回状态。因此,原始父母分叉两次,但孩子不会。结果是只会生成三个进程。
另一方面,&
运算符没有短路评估,因为它不是逻辑AND,而是按位AND。由于&&
不是关于布尔值,而是关于位(与fork() & fork()
不同),因此总是计算两个参数。这意味着在fork()
的情况下,父级将分叉两次,第一个子级将再次分叉,从而产生四个不同的进程。
<Property Id="InstallURL">$(var.HomepageURL)install?ver=$(var.VersionNumber)</Property>
<Property Id="UninstallURL">$(var.HomepageURL)uninstall?ver=$(var.VersionNumber)</Property>
<!-- Set value of WixShellExecTarget property to value of InstallURL if this is first time install -->
<SetProperty Id="WixShellExecTarget" Action="SetInstallURL" Value="[InstallURL]" Before="OpenURL" Sequence="execute">NOT Installed</SetProperty>
<!-- Set value of WixShellExecTarget property to value of UninstallURL if this is uninstall -->
<SetProperty Id="WixShellExecTarget" Action="SetUninstallURL" Value="[UninstallURL]" Before="OpenURL" Sequence="execute">REMOVE</SetProperty>
<CustomAction Id="OpenURL" BinaryKey="WixCA" DllEntry="WixShellExec" Return="ignore" />
<InstallExecuteSequence>
<Custom Action="OpenURL" After="InstallFinalize"/>
</InstallExecuteSequence>
。如果你使用的工具你不明白这样的问题会经常困扰你。