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 の man ページからのものですが、他のシステムでも同様の理由があります。)

于 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 に答える