关于在C中fork()系统调用的困惑

时间:2017-02-10 00:34:52

标签: c fork

我不明白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)

3 个答案:

答案 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()的情况下,父级将分叉两次,第一个子级将再次分叉,从而产生四个不同的进程。

顺便说一下,你应该学习C语言,而不是直接跳到<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> 。如果你使用的工具你不明白这样的问题会经常困扰你。