Moin zusammen,
ich schreibe gerade an einem Updater. Dabei stehe ich nun vor dem Problem, dass ich auch den Updater updaten möchte. Dafür habe ich die das binary unter dem Namen "ToUpdate" in dem Verzeichnis des Programms. Der Updater (in C++ geschrieben) prüft zunächst, ob es eine neue Updater-Version gibt. Ist dies der Fall, speichert er sie eben unter "ToUpdate" (das funktioniert bereits). Nun zu dem eigentlichen Problem: Wenn nun der Updater nicht mehr aktuell ist, sollte er beendet werden, durch "ToUpdate" ersetzt werden und neu gestartet. Die Frage ist: Wie mache ich das genau?
Ich dachte mir, es ist am einfachsten, ein Skript zu schreiben, das aufgerufen wird. Anschließend beendet sich der (veraltete) Updater. Nun soll das Skript "ToUpdate" nehmen und damit den Updater überschreiben. Das Problem, das jetzt da ist: Ich kann wohl nicht einfach das binary überschreiben ohne sicher zu sein, dass das Programm beendet ist. Daher müsste ich wohl schauen, ob das Programm beendet ist. Dafür könnte ich an das Skript die ID des Updaters übergeben (vll. via getpid() ?; ist das plattformübergreifend? Wenn nicht, gibt es sowas? Vll. in Boost?).
Danach müsste das Skript solange warten, bis der Updater beendet ist. Wie kann ich das anhand der ID überprüfen?
Nun müsste es nur noch den Updater überschreiben und neu starten.
Das ganze muss plattformübergreifend sein, aber ich gehe fast davon aus, dass ich 2 verschiedene Skripte brauchen werde. Ich habe gehört, bei Unix-artigen OSes sei das überschreiben eines ausführenden Programms möglich?
Vielen Dank.
Gruß,
badday
ich schreibe gerade an einem Updater. Dabei stehe ich nun vor dem Problem, dass ich auch den Updater updaten möchte. Dafür habe ich die das binary unter dem Namen "ToUpdate" in dem Verzeichnis des Programms. Der Updater (in C++ geschrieben) prüft zunächst, ob es eine neue Updater-Version gibt. Ist dies der Fall, speichert er sie eben unter "ToUpdate" (das funktioniert bereits). Nun zu dem eigentlichen Problem: Wenn nun der Updater nicht mehr aktuell ist, sollte er beendet werden, durch "ToUpdate" ersetzt werden und neu gestartet. Die Frage ist: Wie mache ich das genau?
Ich dachte mir, es ist am einfachsten, ein Skript zu schreiben, das aufgerufen wird. Anschließend beendet sich der (veraltete) Updater. Nun soll das Skript "ToUpdate" nehmen und damit den Updater überschreiben. Das Problem, das jetzt da ist: Ich kann wohl nicht einfach das binary überschreiben ohne sicher zu sein, dass das Programm beendet ist. Daher müsste ich wohl schauen, ob das Programm beendet ist. Dafür könnte ich an das Skript die ID des Updaters übergeben (vll. via getpid() ?; ist das plattformübergreifend? Wenn nicht, gibt es sowas? Vll. in Boost?).
Danach müsste das Skript solange warten, bis der Updater beendet ist. Wie kann ich das anhand der ID überprüfen?
Nun müsste es nur noch den Updater überschreiben und neu starten.
Das ganze muss plattformübergreifend sein, aber ich gehe fast davon aus, dass ich 2 verschiedene Skripte brauchen werde. Ich habe gehört, bei Unix-artigen OSes sei das überschreiben eines ausführenden Programms möglich?
Vielen Dank.
Gruß,
badday