Prozesserzeugung mittels fork()



  • Hi alle zusammen 😉
    ich lerne gerade den Systemaufruf fork() für die Prozesserzeugung.
    Ich wollte nun mal ein Programm schreiben, dass genau 5 Prozesse erzeugt (ohne den Vaterprozess).

    ich wollte mich mal erkundigen, ob das ein richtiger Anfang ist:

    #include <sys/types.h>
    #include <stdio.h>
    #include <unistd.h>
    
    int main () {
    
    	pid_t pid1, pid2;
    
    	pid1 = fork();
    
    	if (pid1 < 0 ) {	/* fork failed */
    		return 1;
    	}
    
    	else if (pid1 == 0) {	/* Kindsprozess */
    		pid2 = fork();
    
    		if (pid2 == 0) {	/* Enkelprozess? */
    			fork();
    		}
    	}
    
    	else {	/* Vaterprozess */
    		wait(NULL);
    	}
    
    	fork();
    
    	return 0;
    }
    

    Kann mir jemand Tipps oder Verbesserungsvorschläge geben?
    Bzw erklären, ob ich da komplett falsch liege?

    Ich freue mich auf Kommentare 🙂
    und gerne auch auf konstruktive Kritiken 👍



  • Keine Ahnug was dein Code genau machen sollte (der macht einfach irgendwas). Willst du vielleicht sowas hier?

    int main()
    {
            int i;
            pid_t pids[5];
    
            for (  i = 0; i < 5; ++i )
            {
                    pids[i] = fork();
    
                    if ( pids[i] == -1 )
                    {
                         // ......
                    }
    
                    if ( pids[i] == 0 )
                    {
                            /* child stuff */
                            exit(0); 
                    }
            }
    
            for ( i = 0; i < 5; ++i )
                    waitpid(pids[i], ...)
    }
    


  • ich wollte nur Prozesse erzeugen. Die Prozesse an sich sollen nichts machen.
    Was macht denn mein Code dann? Erzeugt der Prozesse? 😕 😕



  • fork() erzeugt eine Kopie von dem Prozess der fork() aufruft. Also ein Kindprozess, bei dem der Adressraum kopiert wird. Es kommt drauf an was du damit machen willst.

    Wenn du dir vorstellst, dass du auf gemeinsame Resourcen zugreifen willst, solltest du dir vielleicht eher Threads angucken.

    Wenn du wirklich einen anderen Prozess erzeugen willst, dann kannst du das mit fork() tun. Wenn du nun in diesem Prozess ein alternatives Programm ausführen willst, solltest du dir mal die exec()-befehl Familie angucken.

    Beispiel:

    Du schreibst eine sehr einfache Shell, die Kommandos interpretiert, in sagen wir mal /usr/bin und /bin/ nach dem Kommandonamen sucht. Findet sie etwas, dann ruft sie erst fork() auf, um einen neuen Prozess zu erzeugen und mit exec() führt sie in diesem Kindprozess dann das gewollte Programm aus /usr/bin aus.



  • codie schrieb:

    ich wollte nur Prozesse erzeugen. Die Prozesse an sich sollen nichts machen.
    Was macht denn mein Code dann? Erzeugt der Prozesse? 😕 😕

    genau genommen erzeugt dein code prozess aber dein if-else-elseif mach so überhaupt keinen sinn... (zumindest soweit ich es jetzt gesehen habe ... 🙄 )

    if (pid1 < 0 ) {    /* fork failed */
            return 1;
        }
    
        else if (pid1 == 0) {   /* Kindsprozess */
            pid2 = fork();
    
            if (pid2 == 0) {    /* Enkelprozess? */
                fork();
            }
        }
    
        else {  /* Vaterprozess */
            wait(NULL);
        }
    

    schau dir mal dir rückgabe von fork() im fehlerfall genau an 😉 ...

    das (in deinem code) erzeugt dir aber 1 prozess

    pid_t pid1, pid2;
        pid1 = fork(); // <<<---
        ...
    

    icarus2 schrieb:

    Keine Ahnug was dein Code genau machen sollte (der macht einfach irgendwas). Willst du vielleicht sowas hier?

    int main()
    {
            int i;
            pid_t pids[5];
    
            for (  i = 0; i < 5; ++i )
            {
                    pids[i] = fork();
    
                    if ( pids[i] == -1 )
                    {
                         // ......
                    }
    
                    if ( pids[i] == 0 )
                    {
                            /* child stuff */
                            exit(0); 
                    }
            }
    
            for ( i = 0; i < 5; ++i )
                    waitpid(pids[i], ...)
    }
    

    👍
    mach es am besten einfach so 😉

    hoff konnt helfen 🙄
    lg


Anmelden zum Antworten