使用fork()在C中创建进程的代码会发生什么?

时间:2013-12-24 10:07:52

标签: c process fork

我试图用fork()创建5个进程,进行一些测试以了解该功能。我做了:

int f0, f1, f2, f3, f4;

  switch (f0 = fork()) {
  case (0):
    foo(f0);

    exit(0);

  case (-1):
    printf("\nError!");
    exit(-1);

  default:
    wait();
  }

  switch (f1 = fork()) {
  case (0):
    foo(f1);

    exit(0);

  case (-1):
    printf("\nError!");
    exit(-1);

  default:
    wait();
  }

  //...same for f2,f3,f4

我真的不了解这里的流程。发生了什么?流程真的创建了一个时间?每次我使用fork()时都会创建一个新进程,它从代码的开头开始作为父亲的副本?

另外,我的想法建议我可能会改为:

if (f0 = fork() != -1)
  foo(f0);
else if (f1 = fork() != -1)
  foo(f1);
...

但我真的不明白这些差异。

2 个答案:

答案 0 :(得分:2)

  

每次我使用fork()时,都会创建一个新进程,它从代码的开头开始

不,父进程和子进程都从父进程停止的位置继续执行(但是从fork()接收不同的返回值)。换句话说,它们都执行紧跟fork()之后的语句。

关于你的其他建议:

if (f0 = fork() != -1)
  foo(f0);
else if (f1 = fork() != -1)
  foo(f1);
...

有两个问题:

  1. 有三种情况:(1)我是父母; (2)我是孩子; (3)出现了错误。您的if语句只处理其中两种情况。
  2. 原始代码调用wait(),以便父级等待子级终止。你的版本没有这样做。

答案 1 :(得分:1)

这段代码很麻烦:

if (f0 = fork() != -1)
  foo(f0);
else if (f1 = fork() != -1)
  foo(f1);

除了分叉问题之外,原因是因为operator precedence of C,它表示比较是在分配之前完成的,这意味着f0f1等被分配了比较的值而不是新的进程ID。

您需要使用括号,如下所示:

if ((f0 = fork()) != -1)
  foo(f0);
else if ((f1 = fork()) != -1)
  foo(f1);