Archiv verlassen und diese Seite im Standarddesign anzeigen : unix: auf kinder warten...
felix_do
09-11-2004, 22:38
hi,
ich habe n kinder. wie mach ich das am einfachsten?
wenn (alle meine kinder sind beendet){
beende ich mich selbst
}
sonst weitermachen.
SeeksTheMoon
10-11-2004, 08:06
dafür gibt es wait oder waitpid
felix_do
10-11-2004, 18:12
wait und waitpid blockieren aber. ich will was andres. schau nochmal auf meinen pseudocode.
felix
SeeksTheMoon
10-11-2004, 19:05
für den Pseudocode doch genau richtig: Alle Kinder werden geforkt, ausgeführt und wenn die zu Ende sind, hört auch der parent-Prozess auf.
Wenn der noch nebenher laufen soll, dann starte doch einen extra-Prozess der diese Arbeit erledigt. Ansonsten musst Du mit IPC arbeiten und wahrscheinlich noch nen extra-Prozess aufmachen der ständig nachsieht ob es die Kinder noch gibt (ich weiß jetzt nicht ob es da etwas eleganteres als Polling gibt).
sticky bit
10-11-2004, 20:38
Hmm, du bekommst doch ein SIGCHLD wenn der Kindprozess stirbt? Reicht das nicht?
Ich weiss jetzt bloss gerade nicht wie man eigentlich herausfinden kann wer einem ein Signal geschickt hat, ansonsten würde ich sagen bei jedem fork wird die Child PID in ne Liste gepushed und wenn man ein SIGCHLD bekommt einfach die PID wieder rausstreichen, wenn die Liste leer ist beenden...
hallo,
mal eben:
(prozesse bitte mit kill "num" killen)
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
void childtot();
typedef void (*signalhandler_t)(int);
int main()
{
int proc;
pid_t num;
signal(SIGCHLD,childtot);
for(proc=0;proc<5;proc++){
num=fork();
if(num==0)
pause();
else
printf("Prozess id->%d\n" ,num);
}
while(proc>0){
pause();
proc--;
}
printf("Guten Abend\n");
return 1;
}
void childtot()
{
int status;
pid_t num;
num=wait(&status);
printf("Prozess %d gestorben\n" ,num);
}
dann gibts dann noch WNOHANG
man wait
man signal
gruß
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.