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

时间:2014-09-10 13:16:07

标签: 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;
}

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

所以我们跳过第一个if因为没有发生错误(pid&lt; 0),我们跳过第二个if因为pid不等于0,然后我们进入最后{ {1}}其中C将打印1337,D将打印0。

然后等到孩子完成,我想。

之后,我假设复制的进程(fork())将运行if,但我对原因感到困惑,因为pid仍然是1337 ..

TLDR:如果第一个else if (pid == 0)应该先执行,那么我该如何进入第二个if,但如果这个逻辑完全错误,请纠正我。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

你说的一切都不正确

执行fork()调用之后,子进程和父进程并行运行,两者都执行fork()之后的程序代码。唯一的区别是pid。子进程将使用pid = 0运行相同的程序,并且父进程将使用pid =(子进程的pid)运行相同的程序。它们分开,既有程序的所有变量的副本,又有pid变量的不同副本。

答案 2 :(得分:1)

子项中的

pid为0,父项中的子进程ID为

pid1设置为当前进程的进程ID。子项pid1副本中的值与父项pid副本的值相同。