daemon() und Kontrolle eines Unterprozesses



  • Hallo zusammen,

    ich schreibe gerade ein Programm (mit QT), welches eine technische Simulation in einem Unterprozess startet und mit der Simulation per Netzwerk kommuniziert. Der Sinn davon ist, dass man die Simulation konfortabel starten können soll und sich danach anhand der per Netzwerk übertragenen Informationen davon überzeugen kann, dass die Simulation richtig eingestellt ist.

    Da die Simulation viel Zeit in Anspruch nimmt und vieler Ressourcen bedarf, wird sie auf einem seperaten Rechner ausgeführt. Die grafische Oberfläche wird mit X11-Tunneling auf dem Arbeitsplatz-Rechner angezeigt.

    Ich möchte jetzt eine Funktion einbauen, mit der man das Programm in den Hintergrund schicken kann. Ich habe dafür die Funktion daemon() aus unistd.h verwendet. Das klappt auch gut, jedoch erfährt mein Programm nicht mehr, dass der Unterprozess beendet wurde. Ich kann weiterhin die Ausgabe, die das Programm an stdout schickt lesen und gebe sie in eine Datei aus (über mein Programm, nicht direkt über eine pipe). Allerdings löst der QProcess, wenn das Programm beendet wird nicht das entsprechende Signal/Event aus. Auch wenn ich über einen Timer die state()-Eigentschaft abfrage, ist die Antwort fälschlicherweise "Running".

    Hat jemand eine Idee, wie ich dieses Problem lösen kann? Ich vermute, dass die Ursache darin besteht, dass ich daemon() aufrufe, während der Prozess schon läuft. Ich weiß, dass ich das Problem lösen kann, indem ich einen daemon schreibe, der von Anfang an ein daemon ist und die GUI per Netzwerk mit ihm kommunizieren lasse, aber das ist selbstverständlich einiges an Aufwand. Gibt es eine bessere Lösung?

    Ich habe dies ins Linux-Forum gepostet, da ich vermute, dass trotz der intensiven Verwendung von QT das Problem in den Details der Linux-Prozessverwaltung liegt.

    Vielen Dank!



  • Hast du es schonmal mit wait(2) probiert? Es könnte natürlich sein dass das irgendwie mit Qt kollidiert, kenne mich da nicht aus, aber Grundsätzlich kann man damit z.B auch Rückgabewert und Grund des Beendens herausfinden.


Anmelden zum Antworten