Toon posts:

Process killen zonder Z status

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een programma gemaakt in kylix die als het opgestart wordt een nieuw child process aanmaakt met fork. Vervolgens wordt een ander applicatie opgestart en wordt dit process geplaatst in het nieuw gemaakte child process d.m.v. execv.

Ik weet het PID van dit nieuwe child process. Als ik nu een SIGKILL stuur naar dit process ( kill(process id, SIGKILL) )
dan wordt de applicatie wel gekilled (hij is niet meer zichtbaar op het scherm). Maar als ik ga kijken met ps zie ik dat het process er nog staat alleen nu de status Z heeft.

Hoe kan ik er voor zorgen dat het process gewoon helemaal verwijderd wordt?

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Het proces heeft 'Z' status om dat de parent nog niet geexit is. Zodra de parent stopt wordt het child proces ook opgeruimt.

Waarom gebruik je eigenlijk SIGKILL? SIGTERM zou voldoende moeten zijn.

In wat threads over 'niet te killen processen'(op dit forum) staat ergens een veel betere uitleg, ik weet het niet precies.

"He took a duck in the face at two hundred and fifty knots."


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Het proces heeft de 'Z' (Zombie) status omdat de parent de exitcode nog niet heeft opgevraagd. Voer een wait(2) uit om de status terug te lezen, en het proces zal verdwijnen.

SIGKILL is idd overkill ;)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

Topicstarter
Als ik een wait(2) doe, wordt ook mijn moederproces (hoofdapplicatie) gekilled.


Maar ik zal de situatie ff precies uitleggen:

Ik heb applicatie A. Deze applicatie zal tijdens het creeeren een child process aanmaken. Vervolgens wordt er dus een andere applicatie B gestart. Vervolgens wordt die applicatie geplaatst in het aangemaakte process van A.

Nu zal applicatie A steeds communiceren met applicatie B. Als B dan niet terug reageert, gaat A er vanuit dat applicatie B niet meer goed werkt. Nu zal applicatie A ==> B gaan terminaten (SIGTERM) en zal het opnieuw een child process aanmaken en weer die applicatie B opstarten, enz...

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Verwijderd schreef op 10 April 2003 @ 13:40:
Als ik een wait(2) doe, wordt ook mijn moederproces (hoofdapplicatie) gekilled.
Even voor de zekerheid: Je voert toch niet wait(2) uit?
de '2' duidt op de manpage waarin meer informatie over de call is te vinden

[ Voor 12% gewijzigd door _Squatt_ op 10-04-2003 13:54 ]

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Topicstarter
_Squatt_ schreef op 10 April 2003 @ 13:52:
[...]

Even voor de zekerheid: Je voert toch niet wait(2) uit?
de '2' duidt op de manpage waarin meer informatie over de call is te vinden
:+ Ja dat heb ik wel gedaan, omdat die wait(2) gewoon uit te voeren is.

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Verwijderd schreef op 10 april 2003 @ 14:02:
:+ Ja dat heb ik wel gedaan, omdat die wait(2) gewoon uit te voeren is.
Hehe, is inderdaad gewoon uit te voeren, maar dan probeert wait() wat status informatie te schrijven naar geheugenlocatie '2', dat levert wel een segmentation fault op :).
C:
1
2
3
4
5
/* Als je de status info niet nodig hebt kun je dit doen:    */

wait( NULL);

/* Anders moet je een pointer naar een int meegeven. */

[ Voor 3% gewijzigd door _Squatt_ op 10-04-2003 14:25 ]

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Topicstarter
Bedankt het werkt perfect.
Pagina: 1