Kindprozess beenden.
-
Hallo Forum,
muss ein Kindprozess immer mit exit(Wert) (z.B. exit(42) beendet werden ?
Was paasiert wenn man das exit weg letzt und die funktion ist abgearbeitet?Gruss Olli.
-
Wenn die funktion (int main) ordnungsgemäß abgearbeitet wurde steht dort selbstverständlich return 0;
Und dieser Rückgabewert von int main ist der Exit-Code
-
Hallo LordJaxom,
es geht nicht um den Elternprozess !!! sondern um das Kindprozess.
/* Kindprozess starten. */ void route_check_fork(register int i) { pid_t pid; #ifdef __WIN32__ pid = (pid_t)_beginthread(route_check32, 0, (void*)i); #else pid = fork(); #endif /* __WIN32__ */ if (pid < 0) { printf("Error: fork supplies %u.\n", pid); return; } if (pid == 0) { /* Schreibschutz aktivieren. */ route_tbl[i].busy = TRUE; /* DNS aufloesen. */ route_check(i); } }
Hier ist der Code zu den fragen.
Gruss Olli.
-
Der läuft hinten raus und führt danach denselben Code wie der Elternprozess aus.
Kindprozess und Elternprozess sind nach dem Fork im Speicher identisch. Du musst also in der Abfrage der Pid zwei eindeutig definierte Pfade (wenn pid==0 im Kind und wenn pid>0 im Elternprozess) beschreiten, sonst läuft Dein Programm schliesslich zweimal.
EDIT: Es sei denn Du startest im Kind ein neues Programm via exec. Dann wird das Programm im Speicher ersetzt. Aber Achtung: Auch exec kann fehlschlagen und zurückkehren anstatt das neue Programm zu laden.
-
Im Kindprozess soll er nur die funktion Gethostbyname (ist ja blocking)
ausfuehren. Ist gethostbyname mit der DNS Aufloesung fertig, soll das
Kindprozess beendet werden.In meinen Code-Beispiel, nach route_check(i); muss da nun ein exit oder
geht das ohne?Nur ohne exit habe ich das Programm mehrfach in der Prozess-Tabelle und
mit exit habe ich Zombies. Oder mein Siginalhandle funktioniert nicht:static void KillZombies(int sig) { pid_t pid; int status; /* Wann immer ein Prozess beendet wird, wird ein SIGCHLD-Signal */ /* an den Elternprozess des Kindes gesendet. */ while((pid = waitpid(-1, &status, WNOHANG)) > 0) { /* Wenn es mehr als einen Kindprozess gibt und die Signal- */ /* Bearbeitungsroutine fuer einen gerade beendeten Kind- */ /* prozess aufgerufen wird, kann es passieren, dass ein */ /* zweites Kind beendet wird, bevor die Signal-Bearbeits- */ /* routine mit dem ersten Kind fertig ist. In diesem Fall */ /* kann es sein, dass kein zweites SIGCHDL-Signal erzeugt */ /* wird. Anders augedrueckt, der Programmierer kann nicht */ /* davon ausgehen, dass er fuer jeden Kindprozess, der */ /* beendet wird, ein eignes SIGCHLD-Signal erhaelt. Aus */ /* diesem Grund wird waitpid() in einer while-Schleife auf-*/ /* gerufen. (Kommendar aus C-Programmierung unter Linux) */ } }
rof
-
Der Handler sieht gut aus, installierst du ihn auch?
signal(SIGCHLD, KillZombies);
EDIT: Mit exit ist natürlich besser damit er nicht doppelt läuft
EDIT2: Ähm, dir ist schon klar dass die Daten für beide Prozesse verschieden sind? Das ist nicht wie bei Threads, beide Prozesse haben eigene Speicherbereiche. Deine Änderungen an der Tabelle wirken sich auf den Elternprozess nicht aus!
-
Na so ein schusselfehler HI, hast recht - man muss den Handler auch
RICHTIG installieren, danke.EDIT2: Ähm, dir ist schon klar dass die Daten für beide Prozesse verschieden sind? Das ist nicht wie bei Threads, beide Prozesse haben eigene Speicherbereiche. Deine Änderungen an der Tabelle wirken sich auf den Elternprozess nicht aus!
Nein das war mir nicht klar :(( Gibt es eine Loesung unter Linux?
Unter Win32 funktioniert das ganz gut so.Gruss Olli.
-
Klar gibts ne Lösung
Schau dir mal pthreads an (google), ist fast so wie das Win32-beginthreads. Threads sind aber was anderes als Prozesse