任何人都可以向我解释这个程序的执行情况。叉子如何在这里工作

时间:2014-01-03 18:39:14

标签: c unix fork

任何人都可以向我解释这个程序的工作情况,并向我解释其打印问候世界的输出20次。

#include<stdio.h>
#include<conio.h>
#include <sys/types.h>
int main(){

  if(fork() && fork()){
    fork();
  }

  if(fork() || fork()){
    fork();
  }

  printf("Hello World");
  getch();
  return 0;
}

1 个答案:

答案 0 :(得分:2)

fork()返回:

    父母的
  • :孩子的pid
  • in child:0

所以我们将每个分支标记为A,B,C,D,E,F,以及每个进程P0,P1等:

int main(){

  if(A && B){
    C;
  }

  if(D || E){
    F;
  }

  printf("Hello World");
  getch();
  return 0;
}

以下是每个分支生成的进程:

P0:
  A -> P1
  B -> P2
  C -> P3
  D -> P4
  F -> P5

P1:
 D -> P6
 F -> P7

P2:
 D -> P8
 F -> P9

P3:
 D -> P10
 F -> P11

P4:
 E -> P12
 F -> P13

P5:
 -

P6:
 E -> P14
 F -> P15

P7:
 -

P8:
 E -> P16
 F -> P17

P9:
 -

P10:
 E -> P18
 F -> P19

P11 - P19:
 -

所以你有20个进程。


让我们讨论其中的两个:

P1是P0中叉A产生的过程 所以在P1中,A返回0,因此不评估B和C(在if中,&&的第一个操作数是false,因此表达式被短路并且{{ 1}}是if condition) D被评估并返回!= 0,因此不评估E,评估F(在第二个false中,if的第一个操作数为真,因此表达式被短路并且{ {1}}返回true)。
因此P1通过叉子D和F生成新程序。

P8是P2中fork D生成的过程。所以D返回0.评估E并返回1并评估F.所以P8通过fork E和F生成了新的进程。