Zombie Prozess erzeugen

P

pimpone

Mitglied
Thread Starter
Dabei seit
29.01.2008
Beiträge
77
Reaktionspunkte
5
Hi Leute,
ich komm einfach nicht darauf wieso ich mit folgendem c Programm keinen Zombie Prozess erzeugen kann.

Code:
/* zombie.c */
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>

int main (void) {
   pid_t pid;

   switch (pid = fork ()) {
   case -1:
      printf ("Fehler bei fork()\n");
      break;
   case 0:
      printf("--- Im Kindprozess (%d) ---\n",getpid());
      printf("Elternprozess : %d\n", getppid());
      printf("--- Kindprozess beendet sich ---\n");
      exit(0);
   default:
      printf("--- Im Elternprozess (%d) ---\n",getpid());
      printf("--- Beenden mit <STRG>+<C> ---\n");
      while(1); /* Endlosschleife */
   }
   return EXIT_SUCCESS;
}

Und wenn ich diesen dann haben sollte, kann ich ihn dann doch mit dem Terminalbefehl ps x ausgeben oder?

Greetz
pimpone
 
zum einen erzeugt ein fork() einen Kindprozeß und keinen Zombie. Zombies sind Prozesse die man nicht mehr ansprechen kann, vor allem weil sie keine Übergeordneten (Eltern)prozesse mehr haben die sie terminieren können ( wie es ja im Gegensatz zur Realität durchaus bei Threads üblich ist :) )

Zudem ist pid = fork () ja eine Zuweisung, schreibst Du das in eine if() oder switch()-clause, so wird als Resultat immer das funktionieren der Zuweisung ( true für "hat geklappt" und false für "ging nicht") ausgewertet und nicht etwa der Rückgabewert ( was Du ja wohl willst).
 
und wenn ich mich nicht täusche, wird das child dem controlling terminal zugeordnet, wenn der parent stirbt...
 
Hat sich erledigt. Ich hab übersehen, dass wenn ich den Elternprozess terminiere ja der Zombie (verwaiste Kindsprozess) ebenfalls flöten geht. Lasse ich hingegen das Programm laufen und terminiere es nicht mit Ctrl+C dann wird in er Aktivitätsanzeige auch der Kindsprozess als Zombie angezeigt.

Greetz
pimpone
 
pimpone schrieb:
dass wenn ich den Elternprozess terminiere ja der Zombie (verwaiste Kindsprozess) ebenfalls flöten geht.

Eben genau das geht mit einem Zombie nicht! Es soll passieren ja und wenn es klappt dann hat man einen funktionierenden Kindprozeß. Ist diese Kommunikation nicht mehr möglich ( weil sich der fork vom Elternprozeß frei macht ohne selber Kommunikation zu etablieren) dann und nur dann hat man einen Zombie!
 
zum einen erzeugt ein fork() einen Kindprozeß und keinen Zombie. Zombies sind Prozesse die man nicht mehr ansprechen kann, vor allem weil sie keine Übergeordneten (Eltern)prozesse mehr haben die sie terminieren können ( wie es ja im Gegensatz zur Realität durchaus bei Threads üblich ist :) )
Der OP verwechselt wohl ganz einfach Zombies mit verwaisten Prozessen. Mutmaßlich will er jedoch einen Dämonen erzeugen.

Zudem ist pid = fork () ja eine Zuweisung, schreibst Du das in eine if() oder switch()-clause, so wird als Resultat immer das funktionieren der Zuweisung ( true für "hat geklappt" und false für "ging nicht") ausgewertet und nicht etwa der Rückgabewert ( was Du ja wohl willst).

Doch, doch!

Einfach Beispiel:
Code:
switch( (a = 3) ) {
…
   case 3:
      //*wird ausgeführt
…
   default:
   }
Die Zuweisung hat als Wert den zugewiesenen Wert. (Es gibt kein "ging nicht" bei einer Zuweisung. Zuweisungen haben zu gehen, jedenfalls zur Laufzeit. Und was nicht passt, wird passend gemacht.)
 
anegmawad schrieb:
Die Zuweisung hat als Wert den zugewiesenen Wert. (Es gibt kein "ging nicht" bei einer Zuweisung. Zuweisungen haben zu gehen, jedenfalls zur Laufzeit. Und was nicht passt, wird passend gemacht.)

recht Du hast :)
ich meinte nur in Erinnerung zu haben das C da etwas "sturer" wäre und quasi nur einen switch(true) ausführt, ich hab allerdings schon lange kein reines C mehr genutzt.
 
recht Du hast :)
ich meinte nur in Erinnerung zu haben das C da etwas "sturer" wäre und quasi nur einen switch(true) ausführt, ich hab allerdings schon lange kein reines C mehr genutzt.
Du hast insoweit damit auch Recht, dass man es meist nur als 0, !=0 benutzt. Klassiker sind ja
Code:
while( (object = [enumerator nextObject]) ) {

if( self ) {
Aber es gibt auch einige Leute, die so etwas machen:
a = b = 3

Und das kann man dann auflösen:
a = (b = 3)
a= 3

Ich sach dazu nix …
 
Zurück
Oben Unten