Kinderprozesse erstellen mit fork()



  • Nein ist sie nicht, so ruft ja immer der selbe Kindsprozess die Funktion auf, sie sollen aber abwechselnd die Funktion aufrufen.



  • tobias321 schrieb:

    Nein ist sie nicht, so ruft ja immer der selbe Kindsprozess die Funktion auf, sie sollen aber abwechselnd die Funktion aufrufen.

    Wie kommst du zu dieser Aussage? Wie stellst du das fest?

    Vater und Kind laufen nach dem fork an derselben Stelle weiter
    Alle Variablen sind gleich, nur der Rückgabewert von fork ist anders.

    Das Kind bekommt die 0 und kommt beim else if (pid == 0) in die Endlosschleife.

    Der Vater macht mit dem erzeugen der Kinder weiter, da für ihn die pid != 0 ist.



  • Mein Code sieht jetzt folgendermasen aus:

    // Create the Child processes
        for (int i = 0; i < numberOfProcesses; i++) {
            if ((pid = fork()) == -1) {
                perror("fork");
                exit(EXIT_FAILURE);
            }
            else if (pid == 0) {
                while (1) {
                    printf("%d", getpid());
                    bobo(rand % 20);
                }
                exit(EXIT_SUCCESS);
            }
            else {
                //signal(SIGUSR1, serverReadproducts);
                wait(NULL);
            }
        }
    

    Als Ausgabe erhalte ich immer die selber Prozess Id.
    Noch was anderes, weiß jemand warum ich hier immer den gleichen Zufallswert bekomme? Seed ist am Beginn der Main gesetzt.



  • Jetzt startest du einen Kindprozess, der in einer Endlosschleife die Funktion aufruft. (Argument müsste aber rand()%20 sein, oder? Wie setzt du den seed?)
    Der Vaterprozess wartet aber auf den Kindprozess.

    Willst du, dass die Kindprozesse wirklich abwechselnd die Funktion aufrufen oder einfach alle parallel?



  • parallel geht auch, ok der Vater soll nicht warten, sondern einfach sobald er das Signal SIGUSR1 bekommt in seine Funktion gehen, kann ich das wait(NULL) dann weglassen??

    Seed sieht so aus.

    srand(time(NULL));
    


  • tobias321 schrieb:

    kann ich das wait(NULL) dann weglassen??

    Wenn du nicht willst, dass er immer auf den gerade gestarteten Prozess wartet, musst du es sogar weglassen. Zumindest an der Stelle.

    srand wird also einmal im Vaterprozess aufgerufen. Das heißt aber auch, dass jedes Kind die selbe Folge an Pseudozufallszahlen erzeugt.

    Um auf dein Signal zu warten:

    sigset_t sset;
    	sigemptyset(&sset);
    	sigaddset(&sset, SIGUSR1);
    	sigprocmask(SIG_BLOCK, &sset, NULL);
    	int s;
    	sigwait(&sset, &s);
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) 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.



  • Wie schaff ich es dann, dass jeder Kindprozess eine neue Zufallszahl bekommt?



  • Du kannst die Zahl vor dem fork "ziehen".
    Du kannst srand zB auch mit der pid + time verrechnen. (Für jedes Kind.)
    Wobei du immernoch doppelte Zahlen haben könntest.
    Wieso nimmst du nicht einfach (dem Paramternamen entsprechend) eine fortlaufende Zahl, wie das i aus der Schleife?



  • Weil die Zahl zufällig sein muss, die Zufallszahl ist nichts anderes wie der Index eines Arrays, und der muss zufällig ausgewählt werden. Vor dem fork ziehen geht auch nicht, da bekomm ich immer nur 2 Zahlen. Ich versuchs jetzt noch mit der pid + time.


Anmelden zum Antworten