Anfänger Problem, waitpid()
-
Guten Tag, ich versuche gerade eine Aufgabe zu lösen.
Es geht im Prinzip darum einen Tee-Timer zu realisieren.Was das Programm können soll.
Am anfang Solle das Programm nach der Ziehzeit (wie lange der Tee zum ziehen brauch) und nach dem Teenamen fragen und einlesen.
Danach soll mit fork() ein Kindprozess erstellt werden der dann die angegebene Zeit arbwartet und dann druckt "Tee YX ist fertig". Der Hauptprozess soll weiter
durch eine Schleife direkt wirde von vorne Beginnen damit mann mehrere Timer gleichzeitig starten kann.
Als Zusatz soll beim Erschaffen der Vaterprozess die PID des erschaffenen Prozesses ausgeben und der Erschaffene Prozess seine eigene PID.Bis dahin habe ich auch alles zum laufen bekommen jetzt sollen noch mit waitpid()
die Resourcen der durchgearbeiteten Kindprozesse wieder freigegeben werden.
Daran happert es bei mir stark. Wenn ich wait benutze wird der Vaterprozess suspendiert bis der Kindprozess fertig ist wodurch dann keine gleichzeitigen Timer mehr möglich sind und wenn ich WNOHANG bei waitpid benutzte klappt es nicht.Hier mein Code
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main () { char * tname; tname = (char *) malloc(1000); int ziehzeit; int pid; while (2>1) { printf("Bitte Ziehzeit eingeben: \n"); scanf("%i", &ziehzeit); printf("Bitte Teenamen eingeben: \n"); scanf("%s",tname); waitpid (-1, NULL,0); pid = fork(); if (pid > 0) { printf("Prozess %d erschafft Prozess %d\n",getpid(),pid); } else if (pid == 0) { printf("Ich bin der neu erschaffene Prozess (%d)\n",getpid()); sleep(ziehzeit); printf("%s ist fertig\n",tname); exit(3); } } return 0; }
Ich würde Tips oder Lösungsansätze herzlich entgegen nehmen.
-
waitpid muss man verwenden, nachdem man geforkt hat.
pid = fork(); if (pid > 0) { printf("Prozess %d erschafft Prozess %d\n",getpid(),pid); waitpid(pid, 0, 0); } else if (pid == 0) { printf("Ich bin der neu erschaffene Prozess (%d)\n",getpid()); sleep(ziehzeit); printf("%s ist fertig\n",tname); exit(3); }
-
Thomson schrieb:
tname = (char
malloc(1000);
In C muss man auf malloc nicht casten bzw. sollte es sogar vermeiden!
-
FrEEzE2046 schrieb:
Thomson schrieb:
tname = (char
malloc(1000);
In C muss man auf malloc nicht casten bzw. sollte es sogar vermeiden!
Wobei es sinniger weise viele compiler gibt die eine Warning raus hauen wenn man es nicht macht und man es genau darum dann meistens castet, weil man ja keine warnings haben will... Ist halt von den Herstellern der compiler bissle "mistig" gemacht... Hab es z.B. während meines Studienbelegs auch gecastet, weil die Vorraussetzung für ne 1 war, dass es ohne warnings compiled... Platformunabhängig... und da hatte ich ess dann gemacht. Halt bissle mistig, das die sich da nicht drauf einigen können...
Aber summa summarum geb ich dir auch recht, man sollte es nicht casten
Hab heut meinen Tag, wo ich viel meine Meinung kund tue, hoffe man kann es mir verzeihen
MFG
Blacksyliner
-
C Compiler warnen da nicht. C++ Compiler meckern.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
@Supertux, dies löst mein Problem aber nicht.
Wenn ich deinen Lösungsvorschlag benutze kann ich nicht mehr mehrere Timer
gleichzeitig starten. Das hatte ich aber schon im Eingangspost beschrieben.Mein Ziel ist es die Funktionalität des Programms ohne waitpid beizubehalten und gleichzeitig die Zombies mit Hilfe des waitpid() Befehls zu entfernen.