1
int main(void) { 
  int id = 0;
  for(int i = 1; i < 4; i++) {
    if(fork() == 0) {
      id = i;
    } else {
      printf("Process %d created child %d\n", id, i);
    }
  }
  return 0;
}

在上面的代码中,可以根据操作系统如何调度进程执行来生成输出的多个排序(printf 语句)。可能有多少种不同的排序?您可以假设所有 fork 和 printf 调用都成功。

我试图帮助我的学生了解如何解决这个问题,但是当我写考试时,我在这个问题上得到了很好的 0。我希望有人可以解释如何去做?

4

1 回答 1

0

最后我还没有计算出所有的组合,但这应该能让你继续前进。

您从父进程开始。它将调用fork()3 次,并打印

Process 0 created child 1
Process 0 created child 2
Process 0 created child 3

在它的第一次分叉之后,有一个带有id = 1. 这个过程会继续循环,所以会打印

Process 1 created child 2
Process 1 created child 3

然后,父进程将使用id = 2. 这个过程也将继续它的循环,所以它会打印

Process 2 created child 3

这就是所有的第一代孩子。但是孩子 1 也分叉了自己的孩子 2,这将打印

Process 2 created child 3

i = 3立即退出循环时分叉的所有进程。他们不会再分叉任何孩子,也不会打印任何东西,因此可以忽略它们。

每个进程按顺序打印自己的消息,但它们可以以任何顺序散布在进程之间。一个限制是,在其父级打印表明它创建了一个较早的子级的消息之前,一个子级无法打印任何内容,因为该消息是在创建子级的迭代之前打印的(我假设输出是行缓冲的)。但它可以在表明它已创建的消息之前打印自己的消息!

所以前两条消息可以是:

Process 0 created child 1
Process 1 created child 2

或者

Process 1 created child 2
Process 0 created child 1
于 2019-04-10T23:40:06.847 回答