Hallo!
Hab ein Problem das ich nicht so einfach lösen kann.
Ich hab einen Prozess, der mittels fork() einen Kindprozess erzeugt. Im Hauptprozess warte ich bis der Kindprozess fertig ist. Dauert das jedoch zu lange, so soll ich dem Hauptprozess ein Signal geben können (SIGINT z.B.) worauf anschließend der Kindprozess beendet wird (bzw. in einen Zustand gebracht wird wo er beenden kann).
Das beenden des Kindprozesses soll __ohne__ kill() oder killpg() erfolgen.
Der Kindprozess ruft selber wieder fork() auf und wiederholt dies so lange, bis dessen Kindprozess nicht mehr normal (Exitstatus 0) terminiert, sondern mit Exitstatus 1.
Die einzig mögliche Lösung, die mir einfällt, wäre, dass im Hauptprozess vor dem fork() ein shared memory angelegt wird und ein default-Wert eingetragen wird (z.B. 1). Kommt nun im Hauptprozess das Signal zum beenden des Kindprozesses, so ändere ich einfach das shared memory (z.B. auf 0).
Im Kindprozess wird die fork()-Geschichte ja in einer Schleife gemacht, jetzt einfach mit einer extra Bedingung.
---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---
/* Kind vom Hauptprozess */
int ret, childExit, pid;
...
do {
pid = fork();
...
/* parent zweig */
while((ret = wait(&childExit)) != pid) {
if(ret == -1 || errno == EINTR)
continue;
_exit(1);
}
} while(WEXITSTATUS(childExit) == 0 && shared_memory == 1);
if(WEXITSTATUS(childExit) == 1)
_exit(0);
_exit(1);
...
---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---
Das ist jedoch auch nicht das Gelbe vom Ei, da:
a) ich deswegen kein shared memory anlegen will
b) das irgendwie anders (ohne kill() / killpg()) gehen muss
Die fork()-Schleife vom Kindprozess kann ich nicht in den Hauptprozess verlagern, sie __muss__ im Kindprozess erfolgen.
Falls ihr euch fragt warum ich kein kill() / killpg() verwenden will, ich darf es nicht (Richtlinien Bsp 3, ganz unten).
Hoffe mir kann jemand helfen, ich bin mit meinem Latein am Ende.
LG,
Snafu