pids, ppids, pgid, sid oder pgrep aus c++

soul_rebel

ist immer auf der flucht
also ich würde gerne alle subprozesse meines hauptprgramms abschießen.
mit killpg bzw kill(-) schieß ich den hauptprozess aber mit ab...
gebt es einen weg z.b. alle pids von prozessen anzeigen zu lassen die einer pgid angehören ohne eine shell zu forken und pgrep auszuführen? dann könnte ich selektiv killen....
ich bewege mich hier in c++...
vielen dank für die hilfe
 
Du gibst deinem Master-Prozess ne andere Prozessgruppe und schiesst dann die Kinder ab und setzt dann die pgid wieder zurück ? Weiss aber nich ob das für dich möglich ist, siehe dazu setpgid(2), bzw habs auch nicht ausprobiert.

lg derGloeckner
 
hab ich auch überlegt, aber wie bekomme ich eine freie pgid? habs versucht durch setsid zu machen aber der gibt immer -1 zurück (ist klar in der situation)
 
hi soul_rebel,
ich probier mal aufzuzeichnen wie ich das verstanden habe:
Code:
+master (pid: 1234; pgid: 1234)
   +child1 (pid 1235; pgid 1234)
   +child2 (pid 1236; pgid 1234)
 .....
Wenn du nun die -1234 killst, dann verschwindet dein Master auch.

Laut setpgid(2) - falls ich das richtig verstanden habe kannst du nur den selbem Prozess (solang er noch kein exec gemacht hat) und/oder Kindprozesse eine neue pgid zuweissen, sie müsen in der selben Session sein und die neue pgid muss schon existieren.

Mein Ansatz wäre, ich weisse den gesammten Kinderprozessen die pgid von dem ersten child zu, sähe dann so aus:
Code:
+master (pid: 1234; pgid: 1234)
   +child1 (pid 1235; pgid 1235)
   +child2 (pid 1236; pgid 1235)
 .....
und ich kille dann -1235

- oder -

ich mache ein double-fork am anfang, weisse dem "Zwischenkind" als pgid seine pid zu, forke dann wie ich fröhlich bin und kille dann mein "Zwischenkind":
Code:
+master (pid: 1234; pgid: 1234)
   +intermediatechild (pid: 1235; pgid: 1235)
      +child1 (pid 1236; pgid 1235)
      +child2 (pid 1237; pgid 1235)
 .....
Kostet halt mehr Speicher/Cycles das extra forken.

Hoffe es sind ein paar Anregungen dabei, die dir helfen

lg derGloeckner
 
Zuletzt bearbeitet:
Hi,

ich bin nicht sicher, ob ich richtig verstanden habe, was Du moechtests, aber sollte das nicht so gehen?
Wenn Du fork() aufrufst, bekommt der Parent Process doch die PID des Childs zurueckgeliefert. Im Childprocess machste dann ein exec() (oder aehnlich) und gut. Im Parent haste dann Deine ganzen PIDs der Kinder und kannst dann mit waitpid() warten bzw. mit kill() entsprechend beenden, sofern die Child Processes das nicht alleine machen.

HTH
 
derGloeckner schrieb:
Mein Ansatz wäre, ich weisse den gesammten Kinderprozessen die pgid von dem ersten child zu
und wie mache ich das? wenn ich die pid vom jedem einzelnen kind hätte, könnte ich sie ja auch einzeln killen...
derGloeckner schrieb:
ich mache ein double-fork am anfang, weisse dem "Zwischenkind" als pgid seine pid zu, forke dann wie ich fröhlich bin und kille dann mein "Zwischenkind":
xbit schrieb:
Wenn Du fork() aufrufst, bekommt der Parent Process doch die PID des Childs zurueckgeliefert.
ich forke nicht manuell, ich benutze QProcess, also geht dieser vorschlag nicht...
danke für die hilfe!
 
das killt aber nicht subprozesse die von dem aufgerufenen befehl gespawnt werden.
kprocess kann das angeblich, man kann OwnGroup angeben beim starten und dan soll kill die ganze gruppe killen, aber leider hat kprocess richtige heftige probleme:m ich kriege dauernd qt error wenn ich versuche den output zu puffern, und wenn ich versuche die processgroup zu killen terminiert er meine komplette kdm session....
der quellcode von kprocess hat mir auch nicht geholfen, da wird eine eigene gruppe mittels setsid() angelegt was bei mir wie gesagt immer -1 zurückgibt.
 
Hm... bei mir liefert setsid() einen Wert > 0. Hast Du ein Stueck Code? Das koennte vielleicht helfen, Dein Problem zu beheben.
Ansonsten wuerd ich sagen: Wenn QProcess und KProcess nicht funktionieren, selber programmieren. ;)
 
xbit schrieb:
Wenn QProcess und KProcess nicht funktionieren, selber programmieren.
sehr witzig, das hatte ich ja gemacht (mit popen()), aber weil das group killen nicht ging habe ich kprocess benutzt was dies mit die option hat dem prozess eine eigene gruppe zu geben und die komplett zu killen. leider habe ich mit kprocess beim manuellen puffern des outputs probleme bekommen...
jetzt habe kprocio genommen eine subklasse von kprocess die das puffern selber macht. leider habe ich damit auch speicherprobleme, wie hier in einem anderen thread bez. SIGABRT steht... (siehe thread)
ist alles mist irgendwie :(
 
Zurück
Oben