2010-03-09 9 views
6
void main() 
{ 
    if (fork()) 
    { 
     printf ("PID1 %d\n", getpid()); 
    } 
    else 
    { 
     printf ("PID2 %d\n", getpid()); 
    } 
} 

Was macht dieser Code? Ich weiß, dass es etwas mit Prozess-IDs zu tun hat, aber sollte nicht etwas in die Bedingung zurückgeben, um festzustellen, ob es sich um einen Kind/Eltern-Prozess handelt?c - fork() code

+5

Needs 'Hausaufgaben' Tag? –

Antwort

16

Im Allgemeinen ist es:

pid_t pid = fork(); 
if(pid == 0) { 
    //child 
} else if(pid > 0) { 
    //parent 
} else { 
//error 
} 

Der Mann Seite sagt:

RETURN VALUE 
    Upon successful completion, fork() shall return 0 to the child 
    process and shall return the process ID of the child process to the 
    parent process. Both processes shall continue to execute from 
    the fork() function. 
    Otherwise, -1 shall be returned to the parent process, no child process 
    shall be created, and errno shall be set to indicate the error. 
+0

Ahh ok danke. Edit: Ja, ich sehe viele Beispiele so, weshalb ich verwirrt wurde. – tm1

+0

if (fork()) // wenn die Verzweigung erfolgreich ist ...................... printf ("PID1% d \ n", getpid()); // print parentID ...................... sonst printf ("PID2% d \ n", getpid()); // print Kind ID – tm1

+0

Ist das richtig? Entschuldigung, ich kenne die Code-Tags nicht. – tm1

-2

Der Rückgabewert von fork() zeigt an, ob der Prozess die Eltern oder das Kind. Das Kind wird also immer "PID2 0" ausgeben, denn wenn fork() 0 zurückgibt, wird der zweite Teil der if-Anweisung ausgeführt.

+1

Gibt 'getpid()' nicht die tatsächliche PID des aktuellen Prozesses zurück, egal was 'fork()' zurückgibt? –

+0

@SF: klingt richtig für mich. –

3

Der obige Code erstellt einen neuen Prozess, wenn es den Fork-Aufruf ausführt, dieser Prozess wird eine fast exakte Kopie des ursprünglichen Prozesses sein. Beide Prozesse werden weiterhin separat bei der Rückkehrform ausgeführt, der Gabelungsruf, der die Frage aufwirft "Woher weiß ich, ob der neue Prozess oder der alte Prozess?" da sie fast identisch sind. Um dies zu tun, haben die Fork-Designer den fork-Aufruf veranlasst, verschiedene Dinge in jedem Prozess zurückzugeben, in dem neuen Prozess (das Kind) gibt der fork-Aufruf 0 zurück und der ursprüngliche Prozess (der übergeordnete Fork) gibt die ID des neuen Prozesses zurück, so dass der Vater es kann interagieren mit ihm.

So im Code erstellt der Fork-Aufruf einen untergeordneten Prozess, beide Prozesse tun die If-Anweisung seportal. Im Eltern ist der Rückgabewert nicht Null, also führt der Elternteil die if-Anweisung aus. Im Rückgabewert ist der Rückgabewert 0, also die else-Anweisung. Hoffe, das hilft :-)