PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sleep und wait -> C



Mat
20-10-2005, 18:34
Hallo,
ich will folgendes:

mein Vaterprozess soll mehrere Kinder erzeugen und dann warten bis alle fertig sind.

Jedes Kind soll etwas tun (z.B. bis 5 Zählen) und sich danach beenden.

Das Kind das als erstes fertig ist, soll gewinnen.

Wie soll das gehen...
Hier mein erster Ansatz...


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char **argv)
{

pid_t kind;
int i,status;
int anzahlkinder = 5;

for(i=0;i<anzahlkinder;i++)
{

kind=fork();
switch(kind)
{

case -1 : printf("Fehler bei fork()..........\n"); exit(0);
case 0 : printf("Kind : Kind Nr.%d erzeugt mit PID %d\n"
,i+1,getpid());
sleep(15);
printf("Kindprozess (PID:%d) ist fertig!!\n"
,getpid());
exit(i+1);
default : printf("Eltern mit PID %d von Kind mit PID %d\n"
,getpid(),kind);
while(kind=waitpid(kind, &status, WNOHANG)==0)
{

sleep(1);
printf("Eltern mit PID %d fertig\n",getpid());
}
break;
}
}
return 0;
}

nobody0
24-10-2005, 02:07
Da fehlt sowas wie waitpid.

ProtexX
26-10-2005, 00:48
...außerdem würde in diesem Fall doch immer das erste Kind gewinnen, weil sie ja nacheinander in der for-Schleife erstellt werden, oder?

nobody0
26-10-2005, 07:43
...außerdem würde in diesem Fall doch immer das erste Kind gewinnen, weil sie ja nacheinander in der for-Schleife erstellt werden, oder?

Zu ca. 70 % ja, aber in ca. 30 % der Fälle nicht.
Das ist auch bei Shell-Skripten so, bei denen man hinter eine Kommando-Zeile ein & hängt; die Sachen laufen dann im Hintergrund und parallel (optimal für mehrere CPUs/cores), aber die Reihenfolge ist nicht vorhersagbar.