货叉的可能组合数

时间:2019-04-10 22:16:09

标签: c math fork combinatorics

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。我希望有人能解释该怎么做?

1 个答案:

答案 0 :(得分: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