Problem mit fork()



  • hi!

    ich hab mich mal mit fork ein bißchen gespielt.
    also eigentlich wollte ich einen server programmieren und dazu keine threads verwenden sondern den prozess klonen mit fork.

    das ist mit meinem testprogramm eh ganz gut gegangen.

    ich hab mit scanf etwas eingelesen, dann mit fork() den prozess geklont und dann das eingelesene ausgegeben.

    soweit sogut...

    aber: nachdem der Kindsprozess das ausgegeben hat, soll er sich beenden -> das tut er aber nicht.
    das tut er erst dann, wenn der vaterprozess auch beendet wird.

    hatte jemand auch schon mal das probelm, oder weiss jemand wie ich das lösen kann?

    mfg bauerb



  • Dein Kindprozess wird zu einem Zombieprozess.
    Verhindern kannst du das, indem du im Vaterprozess pid_t wait(int *status) oder pid_t waitpid(pid_t pid, int *status, int options) einbaust. Das heisst aber auch dass der Elternprozess an dieser Stelle stoppt und auf auf das Ende des Kindprozesses wartet.
    Wenn der Elternprozess auch weiterlaufen soll, kannst du z.B. einen Signal-Handler für SIGCHLD einrichten, der dann wait() oder waitpid() aufruft.

    Schau dir mal folgende Seite, Abschnitt 1.6 an, da wird das Ganze besser erklärt:

    http://www.faqs.org/faqs/unix-faq/programmer/faq/

    MfG



  • hi!

    also ich habe mir das so vorgestellt, dass der Vaterprozess auf eine TCP/IP
    connection wartet. wenn eine anfrage kommt, dann soll der vaterprozess die
    verbindung akzeptieren und anschließend mit fork den prozess teilen.

    der kindsprozess soll die anfrage abarbeiten (egal wie lange das dauert) und
    nebenbei der vaterprozess wieder auf TCP/IP connections warten. nach der
    verarbeitung soll der kindsprozess beendet werden, was aber den vaterprozess in
    keinster weise beeinflussen sollte.

    mfg bernd



  • Schau dir mal auf der folgenden Seite den Abschnitt "Server mit fork" an, da findest du genau das, was du machen willst, inklusive Quellcode:

    http://www.zotteljedi.de/doc/socket-tipps/druckversion.html

    Zombieprozesse werden dabei mit einem Signal-Handler für SIGCHLD verhindert.

    MfG



  • hi!

    danke... gute page 😉

    mfg bauerb



  • Ist ganz einfach. Du musst den Child zum Elternprozess machen. Das macht man indem man 2 Mal fork aufruft.
    Such mal hier. Haben wir schonmal diskutiert.



  • Ne, der Doppelfork ist die Lösung für ein _anderes_ Problem. In diesem Fall läuft der "Grossvater" ja auch weiter, ergo wäre der "Vater" dann ja ein Zombie. Es sei denn der Grossvater ruft wait() auf, aber dann sind wir ja wieder bei obiger Lösung und brauchen den Doppelfork nicht mehr.


Anmelden zum Antworten