2

我对 C 完全陌生,并且正在学习流程。我对下面的代码实际上在做什么有点困惑,它取自 Wikipedia,但我在几本书中看到了它,并且不确定为什么,例如,我们这样做了pid_t pid;then pid = fork();。我的阅读似乎表明子进程返回 a pidof ,但是,我认为非常原始的父进程在看到根为 的树后0会保持pidof 。0pid 0

例如,pid = fork();对父母做了什么?因为它不为孩子做同样的事情吗?并且不会pid = fork();将其放入循环中,因为它会为每个孩子执行此操作?

基本上,有人可以向我解释每一步,就好像我是五岁一样?也许更年轻?谢谢!

#include <stdio.h>   /* printf, stderr, fprintf */
#include <sys/types.h> /* pid_t */
#include <unistd.h>  /* _exit, fork */
#include <stdlib.h>  /* exit */
#include <errno.h>   /* errno */

int main(void)
{
   pid_t  pid;

   /* Output from both the child and the parent process
    * will be written to the standard output,
    * as they both run at the same time.
    */
   pid = fork();

   if (pid == -1)
   {
      /* Error:
       * When fork() returns -1, an error happened
       * (for example, number of processes reached the limit).
       */
      fprintf(stderr, "can't fork, error %d\n", errno);
      exit(EXIT_FAILURE);
   }
   else if (pid == 0)
   {
      /* Child process:
       * When fork() returns 0, we are in
       * the child process.
       */
      int  j;
      for (j = 0; j < 10; j++)
      {
         printf("child: %d\n", j);
         sleep(1);
      }
      _exit(0);  /* Note that we do not use exit() */
   }
   else
   {
      /* When fork() returns a positive number, we are in the parent process
       * (the fork return value is the PID of the newly created child process)
       * Again we count up to ten.
       */
      int  i;
      for (i = 0; i < 10; i++)
      {
         printf("parent: %d\n", i);
         sleep(1);
      }
      exit(0);
   }
   return 0;
}
4

3 回答 3

3

执行 fork() 函数后,您有两个进程,它们都在 fork 调用后继续执行。两个进程之间的唯一区别是 fork() 的返回值。在原始进程中,即“父进程”,返回值是子进程的进程 id (pid)。在新克隆的进程“子”中,返回值为 0。

如果您不测试 fork() 的返回值,则两个进程的操作将完全相同。

注意:要了解 fork() 函数为何有用,您需要阅读 exec() 函数的作用。此函数从磁盘加载一个新进程,并将调用者进程替换为新进程。fork() 和 exec() 的组合实际上是启动不同进程的方式。

于 2013-04-05T13:58:45.100 回答
2

成功完成后,fork()来源):

  • 应返回 0 给子进程
  • 并将子进程的进程ID返回给父进程。

你给出的例子解释得很好。但是,我想明确指出,两个进程(父进程和子进程)都应继续从该fork()函数执行。

如果您想知道孩子的 PID(来自孩子的代码),请使用getpid API

于 2013-04-05T14:02:47.773 回答
1

fork是一个返回两次的函数 - 一次返回父级,一次返回子级。

对于孩子,它返回0,对于父母孩子的pid,任何正数;对于这两个进程,在分叉后继续执行。

子进程将运行else if (pid == 0)块,而父进程将运行else块。

于 2013-04-05T13:21:55.713 回答