13

我目前正在研究 C 中的 fork() 函数。我了解它的作用(我认为)。为什么我们在下面的程序中检查它?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
  int pid;
  pid=fork();

  if(pid<0) /* Why is this here? */
  {
    fprintf(stderr, "Fork failed");
    exit(-1);
  }
  else if (pid == 0)
  {
    printf("Printed from the child process\n");
  }
  else
  {
    printf("Printed from the parent process\n");
    wait(pid);
  }
}

在这个程序中,我们检查返回的 PID 是否 < 0,这表示失败。为什么 fork() 会失败?

4

5 回答 5

19

从手册页:

Fork() will fail and no child process will be created if:
[EAGAIN]           The system-imposed limit on the total number of pro-
                   cesses under execution would be exceeded.  This limit
                   is configuration-dependent.

[EAGAIN]           The system-imposed limit MAXUPRC (<sys/param.h>) on the
                   total number of processes under execution by a single
                   user would be exceeded.

[ENOMEM]           There is insufficient swap space for the new process.

(这来自 OS X 手册页,但其他系统上的原因类似。)

于 2013-11-14T23:42:10.703 回答
17

fork可能会失败,因为你生活在现实世界中,而不是一些无限递归的数学幻想世界,因此资源是有限的。特别是,是有限的,这为可能成功sizeof(pid_t)的次数设定了一个硬上限 256^sizeof(pid_t) (没有任何进程终止)。fork除此之外,您还需要担心其他资源,例如内存。

于 2013-11-15T00:53:01.677 回答
2

可能没有足够的内存来创建新进程。

于 2013-11-14T23:41:28.507 回答
1

例如,如果内核无法分配内存,那就太糟糕了,会导致fork()失败。

看看这里的错误代码:

http://linux.die.net/man/2/fork

于 2013-11-14T23:41:52.883 回答
1

显然它可能会失败(不是真的失败,而是无限挂起),因为以下几件事结合在一起:

  1. 试图分析一些代码
  2. 许多线程
  3. 大量内存分配

也可以看看:

例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
    size_t sz = 32*(size_t)(1024*1024*1024);
    char *p = (char*)malloc(sz);
    memset(p, 0, sz);
    fork();
    return 0;
}

建造:

gcc -pg tmp.c

跑:

./a.out
于 2020-04-08T18:35:03.973 回答