Sven: Allgemeine Frage zu fork()

Hallo,

ich hab hier und im Netz die Dokumentation zu fork() durchgelesen. Ganz sicher bin ich aber noch nicht, ob ichs kapiert hab.

Irgendwie warten in allen Beispielen die Parent-Prozesse auf Ihre Child-Prozesse an einer Stelle per wait oder waitpid. Das ist nur, um deren Möglichkeiten gleich mitzudemonstrieren, oder?

Kann ich also auch forken und parent und child machen 2 ganz verschiedene Dinge und irgendwann ist das child fertig, beendet sich und nur der parent läuft weiter?

Praktisch brauche ich nämlich eine Möglichkeit, das ein Perl-Skript in einer FastCGI-Umgebung sich forken muss. Child macht noch einige zeitunkritische Arbeiten nach vollendeter Seitenaufgabe, während der Parent schon wieder die nächsten Seitenaufrufe abarbeitet.

Würde ich nicht forken, hab ich Performance-Probleme, denn die zeitunkritischen Arbeiten müssen abgeschlossen werden, bevor sich das Skript an die nächste Seite macht.

vielen Dank für Eure Hilfe
Sven

  1. Hallo,

    allgemein: fork() koppelt Child-Prozesse ab, die laufen eigenständig weiter. Der Parent muss nicht warten bis ein Child die Hand hebt "fertisch". Kann er aber, siehe Interkommunikation zwischen Prozessen:

    http://www.perl.com/doc/manual/html/pod/perlipc.html

    Btw., als Alternative zu CGI mit PERL und fork() sehe ich, je nach Aufgabenstellung AJAX. Das hat zwar 100%ig nichts mit fork() zu tun, kann aber ähnliche Aufgaben lösen, weil asynchron.

    Und das geht so:
    Ein UserAgent (Moz, FF, IE) requestet eine HTML-Datei. In dieser Seite ist eine Funktion eingebaut, die per AJAX einen serverseitigen Prozess startet, welcher asynchron nebenherläuft. Dieses "Nebenherlaufen" hat auf das Laden der ursprünglichen HTML-Datei (kann auch ein CGI sein) keinen Einfluss.

    Viele Grüße vom Buzzer

    1. Hi,

      allgemein: fork() koppelt Child-Prozesse ab, die laufen eigenständig weiter. Der Parent muss nicht warten bis ein Child die Hand hebt "fertisch".

      Merci für die Gewissheit!

      Kann er aber, siehe Interkommunikation zwischen Prozessen:

      http://www.perl.com/doc/manual/html/pod/perlipc.html

      Danke für den Link. Blüht mir sicher auch noch mal - aber fürs erste Gott sei Dank nicht.

      Btw., als Alternative zu CGI mit PERL und fork() sehe ich, je nach Aufgabenstellung AJAX. Das hat zwar 100%ig nichts mit fork() zu tun, kann aber ähnliche Aufgaben lösen, weil asynchron.

      Um ehrlich zu sein: Nachdem ich mich mit AJAX etwas auskenn, hab ich mir intuitiv vorgestellt, dass es einen solchen asynchronen Systemaufruf geben müsste. Dann würde ich unter Unix einfach ein schmales CGI aufrufen, das diese Kleinigkeiten fertigmacht. Geht ja aber bekanntlich nicht.

      Das mit dem forken ist zwar toll, hier aber eigentlich irgendwie zu viel des guten. Aber Hauptsache es geht.

      Aber auch Danke für die Idee AJAX ins Spiel zu bringen. Daran hätte ich überhaupt nicht gedacht, aber tatsächlich ein interessanter Lösungsansatz. In dem Fall werde ich es lieber komplett am Server lösen, aber das merk ich mir ...

      Merci
      Sven

    2. Hallo,

      Und das geht so:
      Ein UserAgent (Moz, FF, IE) requestet eine HTML-Datei. In dieser Seite ist eine Funktion eingebaut, die per AJAX einen serverseitigen Prozess startet, welcher asynchron nebenherläuft. Dieses "Nebenherlaufen" hat auf das Laden der ursprünglichen HTML-Datei (kann auch ein CGI sein) keinen Einfluss.

      von dem würde ich eher abraten. Bei dieser Lösung rennt der AJAX-Request auch so lange, bis der Server fertig ist. Auf den Response braucht man zwar nicht mehr zu warten, aber meines Wissen lässt der Browser die Verbindung so lange offen, bzw. wartet auf den Response. Somit ist eine Client-Server-Verbindung blockiert und AFAIK kann z.B. der IE nur 4 (?) Verbindungen gleichzeitig aufmachen. Wenn man das 4x macht, dann tut der IE nix mehr.

      Grüße,
      Martin.