sleep und wait -> C
-
allo,
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; }
-
Momentan macht dein Programm ja folgendes, es erzeugt ein Kind, wartet eine Sekunde, dann erzeugt es ein weiteres und wartet wieder, und so weiter. Dann beendet es sich. Und dann laufen nach und nach die Kinder aus.
Was du machen musst, du musst 5 Kinder erzeugen, wenn das letzte erzeugt ist auf Wartemodusgehen und wenn eins fertig ist aufhören.#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(int argc, char **argv) { pid_t kind[5], winner; int i, j,status; int anzahlkinder = 5; for(i=0;i<anzahlkinder;i++) { kind[i]=fork(); switch(kind[i]) { 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 %d (PID:%d) ist fertig!!\n" , i+1, getpid()); exit(0); // Kind normal beendet default : printf("Eltern mit PID %d von Kind mit PID %d\n" , getpid(), kind[i]); if (i == anzahlkinder -1) // erst wenn das letzte Kind erzeugt wurde auf die Kinder warten { while( (winner = waitpid(0, &status, WNOHANG)) == 0 ); printf("Eltern mit PID %d fertig\n",getpid()); sleep (2); for (j=0; j<anzahlkinder; j++){ if (kind[j] == winner){ printf("Kind %d hat gewonnen %d\n", j+1, kind[j]); break; } } } } } return 0; }
-
ah jetza.........
danke für die Hilfe und Antwort...hat mir sehr geholfen!!!
Danke
-
diese Zeile ist mir noch nicht ganz klar:
while( (winner = waitpid(0, &status, WNOHANG)) == 0 );
der vater wartet hier bis alle (0) kindprozesse abgelaufen sind. Aber wie kann dann eine richtige zuweisung von winner stattfinden ? Waitpid liefert doch die Pid des fertigen Kindes zurück oder ?
Damit würde doch winner immer mit dem am letzten fertigen Kind überschrieben werden ?Oder bringe ich da etwas durcheinander ?
-
man: waitpid wartet auf den ersten fertigen Kindprozess (wenn ich das richtig verstanden habe - mein Englisch ist etwas eingerostet) und liefert dessen PID zurück. D.h. sobald eines der Kinder fertig geworden ist, wird in "winner" dessen ID eingetragen und die while()-Schleife verlassen (da winner!=0).
-
ah ok...
das heißt zu beginn also sobald er sich auf das warten begibt muss winner 0 sein...ich nehme an das wird durch waitpid durchgeführt...Danke
konnte das bisher nihct aus dokus korrekt für mein verständnis herausfinden..
-
ah jetzt hab ichs :"WNOHANG - der aufrufende Prozess wird nicht blockiert, falls der Kindprozess mit der PID nicht sofort verfügbar ist. waitpid liefert 0 als Rückgabewert."