Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : pid eines zombies rausfinden



mithras
15-11-2002, 22:44
bei einem proggi von mir wird bei jedem durchlauf einer bestimmten stelle ein neuer zombie erstellt, weil:


fork()

prozess a wird gestartet
.... und ausgeführt

prozess b wird gestartet
... und ausgeführt


im Prozess b, wird prozess a via Signal gekillt, dann wird per longjmp (ähnlich go to) wieder an die Stelle vor fork hingesprungen, sodass fork nochmal ausgeführt wird, nun wird ein zombie erzeugt, da sich ja quasi prozess b überlappt (prozess b war bereits vorhanden, es wird dennoch ein neuer erzeugt!)
Mit wait, oder waitpid, was mir bisher empfohlen wurde kreig ich das nicht auf die reihe.
hab nun schon versucht den zombie durch seine pid einfach zu killen (via signal) aber scheinbar wird der immer wieder neu erstellt, jedenfalls konnte ich ihn so auch nicht loswerden!?

pik7
16-11-2002, 00:08
der zombie wird erzeugt wenn prozess b den prozess a killt.

zombies kan man auch nicht killen den sie sind schon tot
sie verbleiben solange in der prozesstabelle bis jemand den exit status
abholt entweder der parent mit waitpid oder pid oder wenn der nicht
mehr existiert übernimmt init (PID 1) das.

ziemlich mekwürdiges Design hat dein Programm :D

The Ripper
16-11-2002, 09:50
das kann nicht funktionieren, wait() und waitpid() warten nur auf kindprozesse des aufrufenden prozesses.
vielleicht schreibst du mal hier rein was dein programm machen soll, dann können wir mal über ein besseres design nachdenken ;)

mithras
16-11-2002, 20:24
Ok,

ich versuchs mal, aber noch ein paar Fragen zu wait bzw. waitpid.

Mein Zombie wird kreiert wenn Prozess b (Eltern) Prozess a (Kind) killt.
Nun müsste ich, um den Zombie zu verhindern, mit waitpid() im Eltern Prozess (Prozess b) via waitpid(hier pid des kind, also des prozesses a) den zombie "abfangen". Also dadruch verhindern?

Sehe ich das so richtig?

pik7
16-11-2002, 20:34
korrekt erkannt.

mithras
16-11-2002, 20:59
hab das jetzt so ausprobiert, allerdings liefert waitpid -1 also einen fehler!?

Fehler: Invalid-Argument

Obwohl ich ihm die pid des gekillten KInd Prozesses gebe!
Das ist genau die PID, die ich vorher gekillt habe!
aufruf:

waitpid(pid);

mithras
16-11-2002, 21:07
ich idiot!

ich hab waitpid ja falsch aufgerufen!
muss so sein:
waitpid(p_pid, NULL, 0);

bzw. halt dann die optionen wenn benötigt!

argl hat mir aber auch keiner gesagt dass watipid noch zusätzl args braucht :D

anda_skoa
16-11-2002, 22:08
Original geschrieben von mithras

argl hat mir aber auch keiner gesagt dass watipid noch zusätzl args braucht :D

:)
meine man page zu waitpid sagt das.

Ciao,
_