Thread beenden
-
Ich versuche mich mal wieder etwas an Threads, allerdings ohne irgend eine Hilfsbibliothek wie z.B. pthreads.
Einen Thread erstellen kann ich auch, dies mache ich mit "clone"
Dies sihet in etwa so aus:... char *stack; stack = new char[65536]; a_thread.thread_pid = clone(&ThreadFunktion, &stack[65535], SIGCHLD | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_PTRACE | CLONE_VM, &daten); ,,, ,,, int ThreadFunktion(void *daten) { // mache irgend was return 0; }
Soweit komme ich auch und die Funktion ThreadFunktion wird auch ausgeführt. Nach dem die Funktion mit return 0 "zurück kehrt", sollte der Thread beendet sein. Dies ist er auch, allerdings tacht er unter der Bash mittels "ps -A" immer noch auf, ist dort allerdings auch mit "<defunct>" markiert.
Also es läuft alles, nur diese unschöne Ausgabe der laufenden Prozesse stört mich noch etwas.Wie kann ich dafür sorgen, dass der Prozess auch anschliessend nicht mehr von "PS" angezeigt wird?
(ohne "ps > ....")
Gruss
Sven
-
<defunct> hört sich ganz nach Zombie an. Versuch mal mit wait (oder waitpid) auf den Thread zu "warten" oder schau ob das ZOMBIE Signal generiert wird
-
Jo, der Tipp mit waitpid war schon SEHR gut, hab's gleich mal getestet. Wenn ich mittels waitpid auf den Thread warte, dann wird er auch wieder aus der Liste gelöscht. Aber dies bringt mir ja nicht sehr viel... Wenn mein aktueller Thread auf den neuen Thread warten muss, dann kann ich ja auch gleich bei einem Thread bleiben.
Ich habe auch mal einen Signalhandler eingerichtet, der auf SIGCHLD hört. Der wird auch immer aufgerufen, wenn ein Thread zu Ende geht. Aber was meinst Du mit ZOMBIE-Signal? Und was könnte ich dann im Signalhandler machen?
Bin ratlos, aber dass das mit waitpid geklappt hat, gibt mir Hoffnung!
Noch eine Idee?Danke,
Sven
-
Mit ZOMBIE Signal meinte ich SIGCHLD, dass solltest du doch normal abfangen können
void chld(int sig) { int status; wait(&status); } int main() { //... signal(SIGCHLD, chld); //... }
-
Aaaahh, im Signalhandler muss man auf den Thread warten !!!! Super, klapp!
Aber was genau ein Zombie ist, und wieso man auf den Thread dort warten muss, ist mir immer noch ziehmlich unklar. Naja, ich werd's einfach jetzt immer so machen, aber mir den Kram auch nochmal durchlesen.Also nochmals vielen Dank!
-
Der Kernel bewart immer noch einige Informationen über den Prozess (bzw. Thread in dem Fall) auf um sie dem Parent Prozess zur Verfügung zu stellen (siehe status Variable bei wait/waitpid), dies tut der solange, bis man sie abholt mit wait oder waitpid
-
Ja, das ist doch mal eine kurze, präzise Info, die auch ich verstehe