ping google aktivieren und cutten

Ich will in c ein Programm schreiben, das mit fork das ping google im terminal aktiviert und das ich dann an einer x beliebigen globalen stelle wieder killen oder cutten kann. wichtig ist an x-beliebilger stelle:

Mit dem Starten geht das eig.:

Code:
int pid;
pid=fork();
if (pid!=0)
{
}
else
{
	system("ping google.de");
}

Wie kann ich dieses ping google jetzt an x-beliebiger stelle im Programm beenden?

der Quellcode verläuft local in einer funktion.

Bitte helft mir weiter ich bekomme das nicht hin, dass ich das an beliebiger stelle sauber beenden kann :S

Danke
 
Wichtig ist, dass du abwarten musst bis der Child-Prozess beendet wurde, bevor du den Parent abwürgst, ansonsten erzeugst du einen Zombie-Prozess.
Um dem Child mitzuteilen, dass es jetzt beendet werden soll gibt es diverse Mittel - du könntest z.B. eine Condition Variable hernehmen.
 
Das mit den Zombies kapier ich nun langsam, aber wenn der Parent warten soll bis der child prozess fertig gelaufen ist, bringt mir das ja überhaupt nichts, denn in meinem parent prozess läuft ein gui weiter, und wenn der auf den child prozess warten muss, ist das eig. nicht das was ich wollte :S

edit:
ich habs nun mal ungefähr so getestet

Code:
int pid;
pid=fork();
if (pid!=0)
{
	my=pid;
	sleep(3);
	kill(pid, SIGTERM);
	wait(NULL);
}
else
{
	system("ping google.de");
}

Aber da muss noch einiges nicht stimmen ...
p.s. die variable my ist eine global definierte variable, ich dachte das ich so prozess irgendwo immer noch killen könnte
 
Zuletzt bearbeitet:
Wenn du nur das Child beenden möchtest, kannst du dass mit kill_pid natürlich machen. Ich dachte es geht darum beide Prozesse zu beenden, sorry.
Würd dir aber trotzdem dazu raten die beiden Prozesse zu synchronisieren, damit du sichergehn kannst dass das Child auch etwas gemacht hat, bevor es beendet wird.

Edit:
Warte im Parent mit waitpid noch ab, bis das Child beendet wurde.
Du kannst dir die Prozesshierachie mit "ps" im Terminal ansehen - so hab ich das damals zumindest immer gemacht.
 
Zuletzt bearbeitet:
Doch klar möchte ich dass der child und der prozess der ja in diesem Falle ping google.de ist beendet wird. Aber ich bekomms einfach nicht hin.

Ich bekomms jetzt zumindest mal hin das nur der child beendet wird, das ping google.de läuft allerdings noch ganz normal weiter


Code:
int pid;
pid=fork();
if (pid==0)
{
	system("ping google.de");
}
else
{
	my=pid;
}

und mit dieser funktion die ich im internet gefunden hab kann ich das child beenden:

Code:
int kill_child(pid_t p, int *status) { 
  if(kill(p, SIGTERM) == -1) { 
    return -1; 
  } 
  sleep(1); // 1 Sekunde Zeit zum beenden geben 
  if(kill(p, SIGKILL) == -1 && errno != EINVAL) { 
  // EINVAL == pid ungültig => Prozess hat sich beendet 
    return -1; 
  } 
  if(waitpid(p, status, 0) == -1) { 
    return -1; 
  } 
  return 0; 
}

P.s.: Ich brauch das bis heute Mittag :'( :D

Edit: Ich bin mir nicht so sicher ob richtig verstanden habe was du meinst.
Ich habe einen Gui der soll immer laufen, irgendwann in dem Gui soll im Terminal ping google aufgerufen werden, das an andere Stelle oder anderer Funktion z.B. einen knopf Druck wieder vollständig beenden kann, sowohl der child prozess als auch das ping google, das ich irgendwie mit der lösung die oben steht immer wieder noch als einzelnen prozess hab, der gui also ja eig. der parent prozess soll dabei weiter laufen.
 
Zuletzt bearbeitet:
Naja, ich würd mal sagen, dass liegt daran das ping wiederum ein eigener Prozess ist.
Dem ist es aber egal ob du das Child - also seinen Parent - beendest, oder nicht. Der läuft einfach bis er fertig ist und beendet sich dann selbst. Eine Möglichkeit wäre, dass du das Child gleich mit einer der exec Funktionen erzeugst - sofern dein Child nichts anderes zu tun hat, als ping auszuführen.
 
Der child soll NUR ping ausführen

Wie mache ich das denn mit exec?
Code:
execl("/usr/bin/ping", "/usr/bin/ping", "google.de", (char *) 0);
so will es nicht so wirklich funktionieren, bekomme errors vom xserver
 
Wichtig ist, dass du abwarten musst bis der Child-Prozess beendet wurde, bevor du den Parent abwürgst, ansonsten erzeugst du einen Zombie-Prozess.

Nicht ganz... Wenn das Parent einen SIGCHLD Handler hat, und der aus irgendeinem Grunde nicht terminiert, entsteht ein Zombie. Wenn das Parent gekillt wird, wird init der Vater.
 
Zurück
Oben