Thread fork kindprozess überwachen (12 answers)
Opened by Jansen at 2009-08-20 10:31

sid burn
 2009-08-20 15:58
#124536 #124536
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ja und Nein. Es hängt davon ab was du erreichen möchtest. Damit du eine klare aussage bekommst.

Grundsätzlich wenn du forkst erstellst du eine komplette Kopie des prozesses. Dabei werden ebenfalls Variablen etc. mitkopiert.

Nach einen aufruf von fork() hast du also praktisch zwei programme die an der selbe stelle sind und ihre ausführung an dieser stelle weiter machen.

Und es hält dich natürlich keiner davon ab auf irgendwelche Variablen zuzugreifen. Daher du kannst irgendwo vorher eine Variable definieren, und nachher natürlich nutzen. Du musst eben nur verinerlichen es sind nach dem fork zwei prozesse die du hast. Daher jedes Programm der parent und der child hat danach seine eigene Kopie der variable.

Wenn du also $irgendwas im parent anpasst, dann sieht der Child prozess davon nichts, für ihn steht in $irgendwas dann noch das drinn was vor dem forken drin stand.

Also kurz gesagt, du kannst schon auf alles zugreifen, nur sind es alles kopien (stimmt nicht ganz). Kurz gesagt die Variablen werden nicht geshared, und es ist nicht so das beide prozesse sich die teilen.

Möchtest du aber das Parent und Child sich Variablen teilen (sharen) dann musst du Threads nutzen. Ebenfalls wenn du Werte einfach nur austauschen möchtest zwischen Parent und Child kannst du auch eine Pipe nutzen. IO::Pipe

Das Thema Pipe gehört dann zu meiner Klammerung warum nicht wirklich alles Kopiert wird. Offene Filehandles werden zum Beispiel gesahred. Greifst du im Child auf STDIN zu oder STDOUT ist es das gleiche wie dein Parent, auch werden logischerweise PID nicht kopiert, sondern eine neue erzeugt. Also es wird nicht alles zu 100% kopiert sondern ein paar sachen gesahred oder neu erzeugt.

Um deine Frage also zu beantworten. Klar kannst du z.B auch auf variablen zugreifen und diese auch verändern. Allerdiengs sind es nach dem Forken kopien vom original, und wenn dein ziel nicht der simple zugriff sondern der austausch von Daten zwischen Parent und Child ist, dann nein, damit teilst du Informationen nicht.

Ansonsten würde ich dir davon abraten den Thread Support von Perl zu nutzen. Zum einen sind es keine echten Threads, zum anderen ist der eingebaute Thread System in Perl Müll.

Ich würde dir eher raten "forks" zu nutzen. Das simuliert die "threads" API nur erstellt es dir im Hintergrund Prozesse. Oder nutze z.B. Coro

Coro habe ich selber noch nicht genutzt, werde ich aber definitiv auch mal bald genauer anschauen. Vorallem in verbindung mit AnyEvent: Coro::AnyEvent
Last edited: 2009-08-20 16:05:51 +0200 (CEST)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread fork kindprozess überwachen