了解fork()和wait()如何协同工作

Aus*_*tin 1 c linux fork wait

这不是代码审查,因为我不了解代码的完整概念.如果仍然应该移动,请告诉我.

我有一些代码,我想解释一下我的想法,我希望有人可以告诉我我哪里出错或者感到困惑,因为我仍然不完全确定发生了什么.

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main()
   {
   pid_t pid, pid1;
   pid = fork();

   if (pid < 0) {
      fprintf (stderr, “fork() failed\n”);
      return(1);
   }
   else if (pid == 0) {
      pid1 = getpid();
      printf (“pid = %d\n”, pid); // A
      printf (“pid1 = %d\n”, pid1); // B
   }
   else {
      pid1 = getpid();
      printf (“pid = %d\n”, pid); // C
      printf (“pid1 = %d\n”, pid1); // D
      wait (NULL);
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,我们有两个进程ID,父进程(pid)和子进程(pid1).一旦我打电话pid = fork(),我相信孩子被启动并被赋予id为0,而父母得到了孩子的ID,比如1337.所以pid = 1337,pid1 = 0.

所以我们跳过第一个if没有发生错误(pid <0),我们跳过第二个if,因为pid不等于0,然后我们进入最后if,C将打印1337,D将输出0.

我想,这等到孩子完成了.

在那之后,我假设复制的进程(fork())将运行else if (pid == 0)但我很困惑为什么,因为pid仍然是1337 ..

TLDR:如果第三个if应该先执行,那么我如何到达第二个if,但如果这个逻辑完全错误,请纠正我.

Joh*_*all 5

fork创建了一个(近乎完美的)正在运行的进程的副本.正如你所推测的那样,一个区别就是fork()它本身的回报价值.因此,假设fork工作,您有两个进程执行相同的代码.一,孩子,if (pid == 0) ...走路径,而父母走这else...条路.您没有关于这两个进程的工作顺序的信息.也许孩子先走了,也许是父母,可能是他们轮流的一半,也许你有两个处理器,他们一起跑...

想象一下,你将这个程序写在一张纸上,然后用手指跟着它,将它滑到页面上.当你到达前叉时,将纸张拿到复印机上,复印一份,将两张纸放在桌子上,用一只手上的食指放在其中一块上,然后移动你的两根手指,每一根滑下来自己的纸.