2013-11-14 6 views
5

Ich studiere derzeit die Funktion fork() in C. Ich verstehe, was es tut (denke ich). Meine Frage ist, warum überprüfen wir es in dem folgenden Programm?Wie/Warum kann Gabel() fehlschlagen

#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); 
    } 
} 

In diesem Programm, das wir prüfen, ob die PID zurückgegeben wird < 0, was einen Fehler hinweisen. Warum kann fork() fehlschlagen?

+0

Wenn Sie aus irgendeinem Grund nicht mehr Prozesse auf Ihrem Betriebssystem ausführen können, schlägt es fehl. Dies ist nur eine Möglichkeit. – squiguy

Antwort

1

Nicht genügend Speicher zur Verfügung, um den neuen Prozess vielleicht zu machen.

1

Wenn der Kernel z. B. keinen Speicher zuweist, ist das ziemlich schlecht und würde dazu führen, dass fork() fehlschlägt.

Haben Sie einen Blick auf die Fehlercodes hier:

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

13

Aus der Manpage:

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. 

(Dies ist von der OS X-man-Seite, aber die Gründe, auf anderen Systemen sind ähnlich.)

8

fork kann scheitern, weil Sie in der realen Welt leben, nicht einige unendlich rekursive mathematische Fantasy-Land und t Hus Ressourcen sind endlich. Insbesondere sizeof(pid_t) ist endlich, und dies setzt eine harte obere Grenze von 256^sizeof (pid_t) auf die Anzahl der Male fork konnte möglicherweise erfolgreich sein (ohne einen der Prozesse zu beenden). Abgesehen davon haben Sie auch andere Ressourcen, um sich Gedanken über Speicher zu machen.

+6

"... weil du in der realen Welt lebst, nicht irgendein unendlich rekursives mathematisches Fantasieland, und somit sind Ressourcen begrenzt." - zu gut! – ChiefTwoPencils