wait()



  • hi,

    irgendwie scheint mein programm nicht auf seine kinder zu warten?

    ich habe:

    pid_t children[5];
    

    und mache nach und nach paar forks:

    if ((children[0] = fork()) == 0){while(1);}
    .
    .
    .
    

    in meinem hauptprogramm warte ich dann:

    wait(children);
    

    aber das scheint er nicht wirklich zu machen, da das hauptprogramm einfach beendet (obwohl er warten müsste, und zwar endlos lange)

    ich weiss, dass es noch eine funktion waitpid() gibt, verstehe sie aber nicht so ganz. und vorallem dachte ich, müsste meine version auch korrekt sein.

    kann es vllt sein, dass er nur auf children[0] wartet? also jetzt unabhängig davon, dass er auch in diesem fall nicht beenden sollte.

    wait() will ja ne adresse, zeigt das array nur auf die erste variable, da war doch was...



  • So wie ich die Hilfe von wait() verstehe, ist der übergebene Parameter ein Rückgabewert.

    Enthält der Parameter statloc einen Wert ungleich NULL, dann wird an dieser Adresse der Beendigungs-Status des untergeordneten Prozesses gespeichert.

    D.h. es wird gewartet, bis sich EIN untergeordneter Prozess beendet.

    Wie man auf das Beenden aller Unterprozesse wartet, kann ich dir leider nicht sagen - vllt. lern ich ja auch mal wieder etwas (falls hier ein anderer postet)!



  • okay also ich mach das jetzt einfach in einer schleife:

    int i = 0;
    for(; i < numChildren; i++){
    wait(&children[i]);
    }

    aber kann man nicht irgendwie mit waitpid() auf alle warten?
    wär cool wenn mir mal ein "wait-freak" oder so das erklärt 😉



  • man pages sind out, was?

    man wait schrieb:

    If pid is 0, the call waits for any child process in the process group of the caller.

    greetz, Swordfish



  • Davon ab dass der Parameter für wait nicht die PID ist, sondern ein Puffer der den Status empfängt (herzlichen Glückwunsch, sie haben sich grad die PID zerschossen :D) (hat aber Th schon erwähnt!)

    Wenn Du mit waitpid oder wait (je nachdem) auf alle Prozesse warten möchtest, warte einfach in einer Schleife
    a) auf jede einzelne PID mit waitpid
    b) n-mal mit wait, wobei n die Anzahl der Kinder ist


Log in to reply