初始进程创建 5 个子进程,并等待它们完成。每个子进程执行 5 次重复,其中在每次重复中

The initial process creates 5 child processes, and waits for them to finish. Each child process performs 5 repetitions, where in each repetition

我对在 c 中使用 fork()sleep()wait() 创建进程有点困惑。取下面一段代码:


       #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    
     void childProcess(void);
    
     void childProcess(void)
     {
       for(int i = 0; i < 5; i++)
       {
         printf("pid: %d email: myemail\n", getpid());
         sleep(1);
       }
     }
    
     int main(int argc, char *argv[])
     {
       for (int i = 0; i < 5; i++)
       {
         pid_t childpid;
    
         if ((childpid = fork()) == 0)
         {
    
          childProcess();
          exit(0);
         }
       }
     
    
     int status;
     while (wait(&status) > 0)
     {
     }
    
     return 0;
    }

这段代码执行后,执行进程但不去除5个进程的重复。我对这个过程有点困惑。

初始进程创建了 5 个子进程,并等待它们完成。 每个子进程执行5次重复,其中每次重复:

打印消息 pid:PID 电子邮件:USER_EMAIL 其中 PID 是进程的子 PID,而 USER_EMAIL 是电子邮件

通过睡眠调用暂停其操作 1 秒(一次)

父进程在完成时打印子进程的 PID

P.S 我编辑代码

@mixalispetros,你有很多事情要解决,它们都必须一起解决才能让你的代码按预期工作。

      exit(0);

      for (int i = 0; i < 5; i++) {
        wait(NULL);
      }

进程结束于 exit(0)wait 从未被调用。

    if (fork() == 0) {
         // what code runs here?  The code in the new process
    }

fork() 条件中的 运行 是什么代码? new 进程的代码。哪个进程应该运行wait()原始过程。所以除了在exit之后,wait()也在错误的进程中。

移动到哪里? 5 个子进程的 for 循环 wait()。为什么要 wait() 有 5 个子进程?因为我们已经启动了 所有 5 个子进程 before 我们进入了 5 wait()s 的循环。

wait()s 不仅必须发生在 子进程 条件块之外,而且还必须发生在 fork().[= 调用的循环之外。 33=]

I'm a bit confused with the creation of processes with fork(), sleep() and wait() in c

令人困惑。经常参考文档以保持直截了当。 记住,fork() returns twice - in the original process (returning the process ID of the new process), and in the new process (returning 0). wait(),会等待下一个子进程退出。

总之,将 wait 循环 放在 子进程 fork() 循环之外。这也会将它移到 child 进程中执行的代码块之外。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main() {
  // this loop creates 5 processes
  for (int i = 0; i < 5; i++) {
    if (fork() == 0) {
      printf("Child %d, PID %d\n", i, getpid());
      sleep(i);
      exit(0);
    }
  }
  // now, all subprocesses were started

  // wait for the same number of child processes to end
  for (int i = 0; i < 5; i++) {
    wait(NULL);
  }
}