2009-06-18 15 views
4

Wir müssen das Ergebnis der folgenden C-Programm sagen:Ergebnis eines kleinen C-Programms

main() 
{ 
    int pid, k, som; 
    som = 0; k = 2; 
    pid = fork(); 
    if(pid == 0) 
     k=5; 
    else 
     wait(0); 
    for(int i = 1; i <= k; i++) 
     som += i; 
    printf("%d", som); 
} 

Meine erste Erwartung 3. Wenn eine der Gabel Anruf getätigt wird, wird der Speicher des Prozesses kopiert, und beide Programme laufen. Der Kindprozess wird dann ausgeführt, aber k ist immer noch gleich 2. Am Ende führt er also 1 + 2 = 3 aus;

Aber wenn dieses Programm ausgeführt wird, gibt es 153 aus. Ich habe nicht den nächsten Hinweis, warum es das ausgibt.

Kann jemand sagen warum?

Antwort

15

Der Grund dafür ist, dass zwei Prozesse auf derselben Konsole ausgedruckt werden. "fork" ist ein Unix/Linux-Befehl, der einmal aufgerufen wird und zweimal zurückkehrt. Einer der Returns wird im ursprünglichen Prozess sein, der fork aufruft und die PID des untergeordneten Prozesses zurückgibt. Die zweite Rückgabe ist 0 und dies zeigt an, dass es sich um den Kindprozess handelt.

Eines der Programme, das Kind, glaube ich, führt zuerst und berechnet 15 als Wert und druckt es zuletzt auf der Konsole. Das übergeordnete Programm wird wegen der Wartezeit (0) als zweites ausgeführt und erzeugt den Wert 3.

+0

offcourse. Habe total vergessen, dass beide Prozesse Output produzieren. – Ikke

+2

Ich glaube, Sie haben Recht. Sie können schnell feststellen, ob dies der Fall ist, indem Sie die letzte Zeile des Programms in printf ändern ("% d \ n", som); – LBushkin

4

15 wird von Kind und 3 von Eltern gedruckt.

0

Zwischen den Werten wird keine neue Zeile gedruckt, sodass die Antwort des Elternteils direkt nach der Antwort des Kindes angezeigt wird.

Jared ist korrekt über die Ursache der Werte.

2

A Elternteil, B das Kind ist, hier sind die wichtigsten Linien:

A: pid = fork(); // returns 0 for the child process 
A: wait(0); 
B: k = 5; 
B: for(int i = 1; i <= k; i++) som += i; // som = 15 
B: printf("%d", som); // prints 15, B finishes, goes back to A 
A: for(int i = 1; i <= k; i++) som += i; // som = 3 
A: printf("%d", som); // prints 3 
Verwandte Themen