gpt4 book ai didi

c - c中fork()&&fork()||fork()是什么意思

转载 作者:行者123 更新时间:2023-11-30 18:19:36 35 4
gpt4 key购买 nike

我对 fork 进程有疑问。我有一个代码是

int main(int c, char **v){
fork();
fork() && fork() || fork();
printf("Hello\t");
}

根据我的说法,上述代码的输出将是24 = 16 次 "Hello" ,因为每个 fork 都会创建自己的两个副本,因此整体变为 2*2*2*2分别是16"Hello" 。但这是不正确的,它给我的输出为 10次你好。这里发生了什么?

最佳答案

这是一个脑筋急转弯,测试您对 fork 以及逻辑运算符在 C 中如何工作的理解。特别是它们的短路评估。它的工作原理基于以下原则:

  • || 如果第一个表达式的计算结果为真值(非 0),则不会计算第二个表达式。

  • && 如果第一个表达式的计算结果为假值 (0),则不会计算第二个表达式。

  • && 的优先级高于 ||。因此,“棘手”表达式相当于完全括号的 ((fork() && fork()) || fork());

  • fork 向子进程返回 0,向父进程返回非 0 的值。失败时返回 -1,但显然问题中假定成功。

考虑到这一点,我们可以按如下方式跟踪进程创建:

  1. 原始进程无条件调用fork。从而产生2个过程。

  2. #1 中的每个进程都调用逻辑表达式中的第一个 fork。这样创建的每个子项都会返回 0,因此它不会在 && 之后调用 fork。现在进程总数为 4。

  3. #1 中的两个进程确实&& 之后调用fork。他们创建了另外 2 个进程。总共有 6 个。父级满足 || 的左子表达式,因此它们不会再调用 fork 。新创建的子进程尚不满足||。所以他们会调用最后一个fork

  4. #2 中创建的两个子级和 #3 中创建的两个子级调用 || 之后的最后一个 fork。它们总共又产生了 4 个进程。将计数增加到 10。

关于c - c中fork()&&fork()||fork()是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48136357/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com