关于使用fork()在C中创建进程,这段代码会发生什么

关于使用fork()在C中创建进程,这段代码会发生什么,c,process,fork,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):

我试图用
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);
...
但我真的不明白其中的区别

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

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

关于你的其他建议:

if (f0 = fork() != -1)
  foo(f0);
else if (f1 = fork() != -1)
  foo(f1);
...
有两个问题:

  • 有三种情况:(1)我是父母;(2) 我是孩子;(3) 有个错误。您的
    if
    语句只处理其中两种情况
  • 原始代码调用
    wait()
    ,以便父级等待子级终止。你的版本没有做到这一点
  • 每次我使用fork()时,都会创建一个新进程,它从代码的开头开始

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

    关于你的其他建议:

    if (f0 = fork() != -1)
      foo(f0);
    else if (f1 = fork() != -1)
      foo(f1);
    ...
    
    有两个问题:

  • 有三种情况:(1)我是父母;(2) 我是孩子;(3) 有个错误。您的
    if
    语句只处理其中两种情况
  • 原始代码调用
    wait()
    ,以便父级等待子级终止。你的版本没有做到这一点
  • 每次我使用fork()时,都会创建一个新进程,它从代码的开头开始

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

    关于你的其他建议:

    if (f0 = fork() != -1)
      foo(f0);
    else if (f1 = fork() != -1)
      foo(f1);
    ...
    
    有两个问题:

  • 有三种情况:(1)我是父母;(2) 我是孩子;(3) 有个错误。您的
    if
    语句只处理其中两种情况
  • 原始代码调用
    wait()
    ,以便父级等待子级终止。你的版本没有做到这一点
  • 每次我使用fork()时,都会创建一个新进程,它从代码的开头开始

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

    关于你的其他建议:

    if (f0 = fork() != -1)
      foo(f0);
    else if (f1 = fork() != -1)
      foo(f1);
    ...
    
    有两个问题:

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

  • 这段代码很麻烦:

    if (f0 = fork() != -1)
      foo(f0);
    else if (f1 = fork() != -1)
      foo(f1);
    
    原因(分叉问题除外)是因为,表示比较是在赋值之前完成的,这意味着
    f0
    f1
    等被赋值为比较值,而不是新的进程id

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

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

    这段代码很麻烦:

    if (f0 = fork() != -1)
      foo(f0);
    else if (f1 = fork() != -1)
      foo(f1);
    
    原因(分叉问题除外)是因为,表示比较是在赋值之前完成的,这意味着
    f0
    f1
    等被赋值为比较值,而不是新的进程id

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

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

    这段代码很麻烦:

    if (f0 = fork() != -1)
      foo(f0);
    else if (f1 = fork() != -1)
      foo(f1);
    
    原因(分叉问题除外)是因为,表示比较是在赋值之前完成的,这意味着
    f0
    f1
    等被赋值为比较值,而不是新的进程id

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

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

    这段代码很麻烦:

    if (f0 = fork() != -1)
      foo(f0);
    else if (f1 = fork() != -1)
      foo(f1);
    
    原因(分叉问题除外)是因为,表示比较是在赋值之前完成的,这意味着
    f0
    f1
    等被赋值为比较值,而不是新的进程id

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

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

    谢谢。第一次使用交换机实现是否会产生一些问题?非常感谢。第一次使用交换机实现是否会产生一些问题?非常感谢。第一次使用交换机实现是否会产生一些问题?非常感谢。第一次使用交换机实现是否会产生一些问题?