Kindprozesse erzeugen



  • Hallo.

    Ich soll als Aufgabe jeweils 3 Kindprozesse erzeugen (also Vater -> Kind1 -> Kind2 -> Kind3).

    Mein Programm sieht so aus:

    #include <unistd.h>
    #include <stdio.h>
    
    void machen() {
    
    	// getpid() gibt ID des aktuellen Prozesses aus
    	// getppid() gibt ID des Vaterprozesses aus
    	printf("Anfangsprozess: %d\n", getpid());
    
    	int i = 0;
    	for (i = 0; i < 2; i++) {
    		if (fork() == 0) { //erstellen eines Kindprozesses, Erfolg bei 0
    			printf("V %d --> %d\n", getppid(), getpid());
    		}
    	}
    }
    
    int main(int argc, char **argv) {
    	machen();
    	return 0;
    }
    

    Wenn ich das jetzt ausführe erhalte ich beispielsweise:

    Anfangsprozess: 2117
    V 2117 --> 2118
    V 2118 --> 2119
    V 2117 --> 2120

    Aus welchem Grund wird der letzte Prozess aus dem Vater erstellt und nicht aus Kind2? Eigentlich sollte da ja 2119 --> 2120 kommen. Die Kontrolle scheint irgendwie wieder zum Vater zurückzuspringen. Wie unterbinde ich das?



  • Wenn ich sie ineinander schachtel funktioniert es. Woran liegt das? Weil er zum Vater zurückkehrt wenn er erneut in die Schleife springt?

    #include <unistd.h>
    #include <stdio.h>
    
    void machen() {
    
    	// getpid() gibt ID des aktuellen Prozesses aus
    	// getppid() gibt ID des Vaterprozesses aus
    	printf("Anfangsprozess: %d\n", getpid());
    
    	if (fork() == 0) { //erstellen eines Kindprozesses, Erfolg bei 0
    		printf("V %d --> %d\n", getppid(), getpid());
    		if (fork() == 0) { //erstellen eines Kindprozesses, Erfolg bei 0
    			printf("V %d --> %d\n", getppid(), getpid());
    			if (fork() == 0) { //erstellen eines Kindprozesses, Erfolg bei 0
    				printf("V %d --> %d\n", getppid(), getpid());
    			}
    		}
    	}
    }
    
    int main(int argc, char **argv) {
    	machen();
    	return 0;
    }
    


  • Was ist ein Prozess?
    🙂



  • Ist das ernst gemeint :)?

    Sozusagen ein eigenes Programm. Aber wenn es so ist wie ich es in meinem zweiten Beitrag geschrieben habe müsste er den Kindprozess doch sofort nach dem Kontrollfluss beenden und auch den zweiten Unterprozess anders erstellen, also so:

    Anfangsprozess: 2117
    V 2117 --> 2118
    V 2117 --> 2119
    V 2117 --> 2120



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ist das ernst gemeint :)?

    Nö, nur ANSI kennt sowas eben nicht. Und tatsächlich hättest du in der Unix-Ecke bessere Chancen.

    Versuch's mal im ersten Beispiel so:

    for (i = 0; i < 2; i++) {
            if (fork() == 0) { //erstellen eines Kindprozesses, Erfolg bei 0
                printf("V %d --> %d\n", getppid(), getpid());
            } else printf("FATAL\n");   // <---
        }
    

    So kommst du sicher schnell dahinter. Ich tippe drauf, dass du dich damit verwirrt hast, dass fork() eine Kopie erzeugt.
    🙂


Anmelden zum Antworten