Serverprogramm soll asynchron anderes Programm starten

21/08/2009 - 18:16 von Robert Berghaus | Report spam
Hallo

Das Serverprogramm (zur Zeit als Service unter Win-XP) bekommt alle
paar Sekunden ein Datagramm (UDP), verarbeitet die Daten und wartet
dann auf das nàchste. Das funktioniert auch einwandfrei.
Einmal am Tag muß ein 2. Programm gestartet werden, welches einige
Aufràum- und Auswertearbeiten vornimmt.
Mit "Win32::Process::Create" starte ich das andere Programm und
prüfe in jedem Zyklus mit "$ProcessObj->GetExitCode", ob sich das
Programm beendet hat und mit welchem Returncode dies geschehen ist.
Aufruf und Returncode werden vom Serverprogramm in einer Log-Datei
festgehalten.
Es findet kein Datenaustausch zwischen den beiden Programmen statt,
nur der Returnwert ist von Interesse.

Jetzt würde ich das gerne auch unter Linux oder OS2 laufen lassen.
Die Win-Funktionen gibt es hier nicht und àhnliche habe ich auch
nicht gefunden.
Eine Möglichkeit wàre wohl "fork" mit "exec" und "waitpid". Die
Varianten mit "system" und "open" scheinen mir nicht zielführend, da
der Serverprozess immer irgendwann auf den Childprozess wartet.

Stimmt meine Vorstellung oder befinde ich mich dabei völlig auf dem
Holzweg?

Grüße aus dem Bergischen Land
Robert
 

Lesen sie die antworten

#1 Peter J. Holzer
21/08/2009 - 23:19 | Warnen spam
On 2009-08-21 16:16, Robert Berghaus wrote:
Das Serverprogramm (zur Zeit als Service unter Win-XP) bekommt alle
paar Sekunden ein Datagramm (UDP), verarbeitet die Daten und wartet
dann auf das nàchste. Das funktioniert auch einwandfrei.
Einmal am Tag muß ein 2. Programm gestartet werden, welches einige
Aufràum- und Auswertearbeiten vornimmt.
Mit "Win32::Process::Create" starte ich das andere Programm und
prüfe in jedem Zyklus mit "$ProcessObj->GetExitCode", ob sich das
Programm beendet hat und mit welchem Returncode dies geschehen ist.
Aufruf und Returncode werden vom Serverprogramm in einer Log-Datei
festgehalten.
Es findet kein Datenaustausch zwischen den beiden Programmen statt,
nur der Returnwert ist von Interesse.

Jetzt würde ich das gerne auch unter Linux oder OS2 laufen lassen.
Die Win-Funktionen gibt es hier nicht und àhnliche habe ich auch
nicht gefunden.
Eine Möglichkeit wàre wohl "fork" mit "exec" und "waitpid".



Richtig.

Eine übliche Variante wàre dann noch, nicht periodisch
waitpid(-1, WNOHANG) aufzufrufen, sondern das in einem Signalhandler für
SIGCHLD zu tun.

Die Varianten mit "system" und "open" scheinen mir nicht zielführend,
da der Serverprozess immer irgendwann auf den Childprozess wartet.



Bei system hast Du recht. Bei open muss das nicht unbedingt der Fall
sein. Du könntest z.B. in Deiner Hauptschleife mit select abfragen, ob
Du ein UDP-Paket empfangen oder der Kindprozess die Pipe geschlossen hat
(d.h., terminiert ist). Aber das ist semantisch schon ein bisschen
zweifelhaft. Wenn es keinen Datenaustausch gibt, würde ich open eher
nicht nehmen.

hp

Ähnliche fragen