PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Geforkten Childprozess auskoppeln?



7.e.Q
29-06-2006, 10:44
Hi Leute,

ich hab in meinem Programm einen Child-Prozess mit fork() gestartet und mit exec() ein anderes Programm als solchen eingesetzt.

Diesen Child-Prozess möchte ich zu einem bestimmten Zeitpunkt so auskoppeln, daß er und seine eigenen Childs (die Enkel des Parent) beim Terminieren (SIGTERM) des Parent-Prozesses NICHT mit beendet wird. Also so, daß sich der Child dann auf der selben Prozess-Ebene befindet, wie der Parent, quasi erwachsen wird... ;)

Geht sowas? Wenn ja, wie? Ich habe Zugriff auf die Sourcen aller drei Ebenen (Parent, Child, Enkel), kann dieses Auskoppeln also in jeder der drei Ebenen vornehmen, wenn nötig.

Ein Enkel des Parent soll nämlich eben jenen Parent (welcher ein Service-Daemon ist) neu starten, ohne selber zu sterben (der besagte Enkel ist ein Update-Programm, das unter anderem den Parent erneuert).

almoeli
30-06-2006, 14:08
Hi,

Vielleicht kann clone das was du brauchst:

man 2 clone

Ist allerdings erst ab einer bestimmten libc (glibc) Version verfügbar (siehe man page). Da gibt es das CLONE_PARENT Flag, mit welchem der neue Prozess den selben Vater bekommt wie der erzeugende Prozess. Die Prozesse laufen dann also als Kinder desselben Vaters.

RapidMax
01-07-2006, 21:31
Da Problem dabei sehe ich darin, dass es mehr als ein Child gibt und so der Update-Prozess die Rolle des Vaters übernehmen soll. Am einfachsten wird es sein, wenn der Parent mittels exec() sich durch das Update ersetzt, und der Update-Prozess bleibt was er ist. Sollte das nicht funktionieren, suchen wir weiter ;)

Gruss, Andy

7.e.Q
03-07-2006, 12:51
Hmm... RapidMax: dein Punkt bringt mich ins Grübeln... den Parent durch den Update-Prozess ersetzen... das muss ich mir mal genau anschauen.

Bei Clone sehe ich das Problem, daß SIGCHLD Signale nicht mehr in dem eigentlichen Parent (der jetzt viel mehr ein Bruder-Prozess ist) ankommen. Das heißt, Kind geht nur bei Mama oder Papa petzen, nicht bei Brüderchen, oder?

mcspam
03-07-2006, 21:13
kannst du den vater nicht selbst beenden lassen? dann würden ja alle kinder weiterleben...

7.e.Q
04-07-2006, 07:46
Könnte ich über ein anderes Signal machen, ja. Die Kinder bleiben am Leben, wenn der Vater sich selbst terminiert?

mcspam
04-07-2006, 11:29
Die Kinder bleiben am Leben, wenn der Vater sich selbst terminiert?
ja. hier mal ein Beispiel:


#include <unistd.h>
#include <stdio.h>

int main(void)
{
int client;
if((client=fork())==0) {
puts("child -> daemon");
for(;;) {
puts("alife");
sleep(5);
}
}
puts("parent -> quitting");
return 0;
}

7.e.Q
04-07-2006, 12:07
Logisch... so macht man Daemons. *kopf->tisch*

nul
04-07-2006, 20:15
Wieso nicht? Du musst nur unterscheiden koennen zwischen Zombi-Prozessen und Orphanen Prozessen.
Sogar der Explorer von Windows laeuft als Orphaner Prozess. Der Userinit Prozess startet den Window Manager (explorer.exe) und beendet sch dann selber.
Jedenfall funktioniert das bei Windows Vista so.