父进程中的Fork()

时间:2014-03-11 04:05:56

标签: c fork

如果我在父进程中调用fork()会发生什么?

一般例子:

int ret;
int fd[2];

ret = pipe(fd);
pid = fork();

if (pid == -1){
    perror("fork failed");
    exit(1);
}

else if (pid > 0){    //PARENT 
    //writes or reads
    fork();

}

这是否意味着fork()将创建父进程的新进程?

我对此很新,所以非常感谢帮助。感谢。

3 个答案:

答案 0 :(得分:1)

  

如果我在父进程中调用fork()会发生什么?

您调用fork()的每个流程都可以被视为父流程。

来自Linux手册页fork(2)

   fork() creates a new process by duplicating the calling process.  The
   new process, referred to as the child, is an exact duplicate of the
   calling process, referred to as the parent, except for the following
   points:

   *  The child has its own unique process ID, and this PID does not
      match the ID of any existing process group (setpgid(2)).

   *  The child's parent process ID is the same as the parent's process
      ID.
   ...

fork()的结果是原始进程运行的两个相同副本。最初调用fork()的人是,结果进程是。子的PPID(父进程ID)等于父进程的PID。

original process
    |
    |    fork() called
    |\
    | \
    |  \
    |   \
parent  child

答案 1 :(得分:1)

每当你打电话给fork时,它会“返回两次” - 一次在父母身份,一次在孩子身上。该描述中的术语“父母”和“儿童”主要是为了便于消除歧义。 (虽然当您开始讨论waitpid时会有一些差异。)它们都是“非常好的流程”,可以继续fork其他流程,或exec,或者只是两人都继续以愉快的方式做一些完全不同的事情。

在你的例子中,让我们假设我们从一个带有pid 1的进程开始。这是我尝试发生的事情的图表,因为不支持表:\

  • 我们第一次分叉。创建了流程2.
    • 在流程1中,fork返回2.
    • 我们继续else if,这是真的。我们再次致电fork。创建了流程3.
      • 在流程1中,fork返回3.
      • 流程1继续在代码段的末尾。
      • 在流程3中,fork返回0.
      • 流程3继续在代码段的末尾。
    • 在流程2中,fork返回0.
    • 流程2继续到else if,这是假的。
    • 流程2继续在代码段的末尾。

所以你最终得到3个过程;进程1是2和3的父进程。这三个中的任何一个都可以再次进入fork,创建更多的子进程等等。

答案 2 :(得分:0)

  

这是否意味着fork()将创建父进程的新进程?

fork()创建一个新进程,其内存与调用它的内存重复(尽管不是共享)。

请记住,流程形成了一个树,其中每个连续的流程都是它所分叉的)。