fork()调用,复制进程

时间:2011-06-17 23:11:44

标签: fork process

fork()用于创建子进程...您也会看到此调用也出现在子进程中。我不明白当他们说'调用fork实际上返回两次'时它意味着什么。

这是什么意思......

if (fork() == 0)
/* the child process's thread executes here*/

else 
/*the parent process's thread executes here*/

以上代码是父母或子女的一部分。你能用简单的英语解释发生了什么吗?

另外,为什么要使用fork()?它说unix中的所有进程都是由这个系统调用的吗?你如何fork()其他程序可以运行?你是否指定了程序的名称?

2 个答案:

答案 0 :(得分:1)

当他们说它返回两次时的意思是,调用在父进程(调用它)中返回一次,并且在子进程中返回一次(尽管你可能认为孩子继承了从父母那里调用fork的行为,就像它继承了很多其他内容一样。)

代码段利用了从fork获取不同返回值的事实,具体取决于您是父进程还是子进程。

子进程获得零,父进程获取子进程的非零进程ID。

如果fork由于某种原因失败,您也可以返回-1,在这种情况下,孩子将不会运行。这也是你应该检查的东西。

而且,虽然fork用于创建新的进程,但exec系列调用,它们将新的程序加载到这些进程中: fork本身无法做到这一点。

可以找到here的完整概述。

答案 1 :(得分:1)

有点像这样:

Process 1               Process 2

int main() {
  ...
  int x = goo();
  ...
  int y = fork();
  // fork() returns...    // ... but also here!

  // here y = 123         // here y = 0
  if (y) {                if (y) {
    // this happens         // false
  } else {                } else {
    // false                // this happens
  }                       }

  int z = baz();          int z = baz();
  ...                     ...
  return 0;               return 0;
}                       }

当进程2生效时,程序存在两次,第二个进程以fork()的返回开始。由于程序在两个进程中都是相同的,因此区分哪个进程的唯一方法是使用fork()的返回值。