【问题标题】:What is the meaning of fork()&&fork()||fork() in c [duplicate]c语言中fork()&&fork()||fork()是什么意思
【发布时间】:2018-06-16 14:37:09
【问题描述】:

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

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

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

【问题讨论】:

  • fork函数在父进程中返回什么?它在子进程中返回什么? short-circuit evaluation 是如何工作的?当您可以回答时,您就知道会发生什么。知道operator precedence 也会有所帮助。
  • 还有一些吹毛求疵:fork 函数仅在将原始父进程计为“副本”时创建两个副本。
  • 表示作业、测验、'-F' 标记或粉红色的纸条。

标签: c fork


【解决方案1】:

这是一个脑筋急转弯,测试您对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。

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2023-03-06
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多