Problem mit fork() und Prozess killen
-
Hallo,
ich habe ein kleines Problem und weiss schon das ich einen Denkfehler drin habe, aber ich komm nicht weiter.
Ich habe einen kleinen Server, der einen Port belauscht, wenn ich dem Server die Zeichenfolge "CMD_LOG" schicke, soll er ein Child-Prozess aufmachen(die PID merke ich mir) und ein Programm starten, was in einer Endlosschleife läuft.Wenn ich dem Server die Zeichenfolge "CMD_STP" schicke, soll der Childprozess, dessen PID ich mir gemerkt habe wieder killen, solang, bis ich wieder "CMD_LOG" schicke ...
Mein Prolem ist nun, das ich in den else if - Zweig nichtmehr auf die "pidc" zugreifen kann????
Hilfe!!!!
int pid; int rc; int pidc; while (1) { new_socket = accept ( create_socket, (struct sockaddr *) &address, &addrlen ); if (new_socket > 0) printf ("Ein Client (%s) ist verbunden ...\n", inet_ntoa (address.sin_addr)); buffer[0]='\0'; size = recv (new_socket, buffer, BUF-1, 0); if (!(strcmp(buffer,"CMD_LOG")) ) { switch( pid=fork() ) { case -1: /* Fehler bei fork() */ break; case 0: /* Hier befinden Sie sich imKindprozess */ rc=execle("/home/alexprog/","endlosprg.bin",NULL); pidc=getpid(); printf("PID:%d",pidc); exit(127); default: /* Hier befinden Sie sich im Elternprozess */ break; } } else if(!(strcmp(buffer,"CMD_STP"))) { printf("ES WURDE DER LOGSTOP BEFEHL GESENDET"); printf("PID:%d",pidc); // Hier wird die korrekte PID nichtmehr angezeigt??? rc=kill(pidc,9); } else { } buffer[0]='\0'; close (new_socket); }
Habe ich den falschen Anatz???
Danke für Eure Hilfe!!!
Gruss Alex
-
Du speicherst die PID des Kindes in der Variablen pid. Merke dass der Elternprozess die PID des Kindes von fork() bekommt.
-
Ponto schrieb:
Du speicherst die PID des Kindes in der Variablen pid. Merke dass der Elternprozess die PID des Kindes von fork() bekommt.
Sorry Ponto, ich kann dir nicht ganz folgen, ehrlich gesagt, ist die Philosophie mächtig kompliziert ... ich dacht ja zuerst pid bekommt die ProzessID, aber da kommt ja 0 ... wie kann ich das anstellen, das ich meinen Programm eine PID verpasse und dann killen kann?
Gruss ALex
-
Du denkst falsch: pid bekommt die Child-ID und Null. Und zwar im Kindprozess Null und im Parent-Prozess die Child-ID. Bedenke dabei dass ab dem fork Dein Programm gewissermassen zweimal parallel abläuft, wobei beide Instanzen keinerlei Zugriff auf die Variablen der anderen Instanz haben (will heissen eine Änderung an pidc im Kindprozess wirkt sich auf den Elternprozess nicht aus).
Solange Du keinen zweiten Kindprozess startest, sollte es also langen, wenn Du im kill (und im printf) die Variable pid und nicht pidc verwendest.