Das Programm soll Zombies vermeiden, indem sie zweimal funken. Ich bekomme den Wert für Eltern-PID des Waisen-Prozesses alles außer 1, was nicht richtig ist.Der Kindprozess, der durch das Töten seines Elternteils zum Waisenkind gemacht wurde, wird nicht von init übernommen. Wie behebe ich das?
Hier ist der Code, den ich ausprobiert habe. Wenn es einen Fehler in der Logik gibt, bitte hilf mir.
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t processid;
if((processid=fork())<0)
printf("Fork error\n");
else if(processid==0)
{
if((processid=fork())<0)
printf("Fork error\n");
if(processid>0)
{exit(0);}
sleep(2);
printf("second child, parent pid =%d\n",getppid());
exit(0);
}
exit(0);
}
Dies ist die Ausgabe erhalte ich:
[email protected]:~# gedit avoidzombies.c
[email protected]:~# gcc avoidzombies.c
[email protected]:~# ./a.out
[email protected]:~# second child, parent pid =1069
Auf Mac OS 10.10 und Ubuntu 14.06lts überprüft - es gibt '1' – Vasfed
Auf meinem System, bekomme ich auch ein verschiedene PID - aber diese PID entspricht Upstart, die ein Init-Ersatz ist. So funktioniert es richtig, aber die PID des init (alternativen) Prozesses ist nicht 1. – Dmitri
Der Weg, Zombies zu vermeiden, ist richtig 'wait()' für das Kind, um im Elternteil fertig zu werden - das Forken des Kindes erzeugt gerade eine Sekunde Z wenn du das nicht tust. Ich vermute, was du zu tun versuchst, ist, dass 'init()' das Ernten des Enkelkindes automatisch behandelt - siehe http://stackoverflow.com/questions/8665642/why-do-i-have-to-wait-for- Kind-Prozesse für Details. (Beachten Sie, dass sich Ihr Code wesentlich von dem Beispiel durch diesen 'wait()' Aufruf unterscheidet ... auch, äh ... tun Sie das nicht, wahrscheinlich =)) – BadZen