Hi Leute,

ich hab mal wieder ein kleines Problem:

mein Programm legt an einer Stelle mit fork() einen Child-Prozess an. Die PID davon lege ich mir im Parent in einer Liste ab. Der Child-Prozess entpackt eine Binary und führt diese danach per exec() aus. Das heißt, der Child-Prozess wird durch die von ihm entpackte Binary überschrieben. Er behält aber natürlich seine durch fork() vergebene PID.

So...

nun habe ich im Parent natürlich auch einen Signal-Handler, der dafür sorgt, daß der Exitstatus des Child-Prozesses auch vernünftig abgefragt wird. Der Signal-Handler für SIGCHLD im Parent-Prozess macht nichts weiter, als die PID eines sich beendenden Child-Prozesses in eine Queue (ich nenne sie mal "Termination-Queue") einzuhängen.

Im Parent-Prozess ist nun eine Funktion, die alle Sekunde aufgerufen wird und den Rückgabestatus des in der Termination-Queue an erster Stelle stehenden Prozesses verarbeitet. Ist nicht schwer.

Nun kommt es aber anscheinend vor, daß nicht alle Child-Prozesse bei Beendigung ein SIGCHLD versenden...

...und ich verstehe beim besten Willen nicht, warum.

Stattdessen erhalte ich sporadisch ein SIGCHLD mit einer PID, die exakt um 1 niedriger ist, als die PID es eigentlich terminierten Prozesses.

Dies bewirkt selbstverständlich, da die Funktion zur Abarbeitung der Termination-Queue die richtige PID des beendeten Child-Prozesses nicht erhalten wird, daß aus dem Child-Prozess ein Zombie wird. Und die selbe Funktion kann auch die Position innerhalb meiner Child-Prozessliste nicht anhand der vom Signal gelieferten PID ermitteln (weil sie ja um 1 niedriger ist, als die eigentlich richtige PID). Dies führt nun dazu, daß der Eintrag des Child-Prozesses in der Liste erhalten bleibt.

Kurz gesagt, die PID, die bei dem SIGCHLD mitgeliefert wird, stimmt nicht mit der PID überein, die zuvor von fork() geliefert wurde.

Warum? Wie kann sowas passieren? Liegt das an exec()? Bekommt ein Prozess, der durch exec() überschrieben wird, eine komplett neue PID? Eigentlich nicht, oder?

Und wenn dem so ist, wie kann ich dem Parent denn dann die neue PID nach dem exec() mitteilen?

Großes Problem! Bitte um Hilfe!

Danke

Grüße,
Hendrik