Programm, dass sein eigenes Binary überschreibt



  • Hallo,

    ich hab ein kleines Problem. Ich möchte in mein Programm eine WebUpdate Funktion einbauen. das funktioniert so weit ganz gut, aber wie kann ich nun die heruntergeladenen Dateien installieren. Wenn ich versuche mit der WebUpdate-funktion meine Programmdatei durch die neue zu ersetzen, funktioniert das verständlicherweise nicht, weil der Prozess die Datei ja verwendet.
    Muss ich da wirklich in meinem Update-Packet eine ausführbare Setup-Datei haben, oder gibt es noch andere Möglichkeiten?
    Hab schon überlegt ein eigenes kleines Copy-Programm zu schreiben, dass nach dem beenden des Hauptprozess die neue über die alte Datei schreibt, aber ich wollte eigtl mit nur einer ausführbaren Datei auskommen.

    Ich suche Lösungen sowohl für Windows als auch Linux.

    Vielen Dank.



  • hi!

    ich würde ein 2. programm schreiben, dass das update selber ist.
    also update in z.b. update.exe stecken.
    wenn man im hauptprogramm update klickt -> beenden & update starten.

    dann müssts doch gehen ?

    [edit] oh hab nicht gesehn dass du nur 1 exe haben willst



  • CGI-BIN schrieb:

    Muss ich da wirklich in meinem Update-Packet eine ausführbare Setup-Datei haben, oder gibt es noch andere Möglichkeiten?

    Eine batch Datei könnte auch reichen.

    Bye, TGGC (Denken, und gut ist.)



  • Für Windows: Du kannst die Datei zwar nicht überschreiben, du kannst sie aber umbenennen, auch wenn sie gerade läuft. Also einfach umbenennen und neu schreiben ist kein Problem.

    Du kannst sie bei der Gelegenheit auch gleich so umbenennen, das die alte Datei beim nächsten Booten automatisch gelöscht wird. Ich habe die Flags gerade nicht im Kopf, steht aber in der MSDN.

    Von Linux habe ich keine Ahnung...



  • CGI-BIN schrieb:

    Ich suche Lösungen sowohl für Windows als auch Linux.

    Unter GNU/ Linux ist das normalerweise kein Problem, Du kannst ohne weiteres ein die Binary eines gerade laufenden Programms löschen.



  • Du kannst auch aus deinem Programm heraus eine Batch-Datei starten, die kontinuierlich verscuht die alte Datei zu löschen und eine von dir neu erstellte Datei umzubenennen zur gelöschten Datei. Das lässt du in einer Schleife laufen, bis es erfolgreich war. Die Fehlermeldungen leitest du nach >NULL um. Wird dein Programm beendet, macht die Batch Datei ihren Job und beendet sich dann.



  • nman schrieb:

    Unter GNU/ Linux ist das normalerweise kein Problem, Du kannst ohne weiteres ein die Binary eines gerade laufenden Programms löschen.

    ich finde dieses verhalten ziemlich eigenartig. Löschen geht, aber überschreiben nicht:

    ~% cat t.c
    int main() { sleep(10); }
    ~% gcc t.c
    ~% ./a.out&
    [1] 2302
    ~% echo>a.out 
    zsh: text file busy: a.out
    ~% rm a.out 
    ~% 
    [1]  + done       ./a.out
    ~%
    


  • DrGreenthumb schrieb:

    ich finde dieses verhalten ziemlich eigenartig. Löschen geht, aber überschreiben nicht:

    ~% cat t.c
    int main() { sleep(10); }
    ~% gcc t.c
    ~% ./a.out&
    [1] 2302
    ~% echo>a.out 
    zsh: text file busy: a.out
    ~% rm a.out 
    ~% 
    [1]  + done       ./a.out
    ~%
    

    Holla, tatsächlich, das hatte ich noch garnicht bemerkt, sehr seltsam.
    Würde mich direkt mal interessiere, worauf genau das zurückzuführen is. 😕

    edit: Shit, falschen Post abgeschickt. 🙂



  • Ich finde es schon eigenartig, dass man es überhaupt löschen kann, dann müsste es ja komplett im RAM sein oder zumindest wieder auf die Platte ausgelagert werden, kein Wunder, dass Linux soooooo llaaaahhhhmmmm ist (beziehe mich auf SuSE 9.1 Personal auf PII 0.35GHz 128MB PC100 SDRAM).



  • @D@niel $chumann
    oh man, du hast echt keine Ahnung.

    Wenn du ein Programm ausführst, wird es natürlich in den RAM geladen und nicht jedes byte von der Platte gelesen, wenn es ausgeführt werden soll (das wär langsam). Und weil deine 128 MB RAM schnell voll wären, gibt es Paging, dann lagert man einfach Teile des RAMs aus, die man erstmal nicht braucht. Prima, nicht?

    Das machen alle neueren Betriebssysteme so. Linux, Windows oder was weiss ich. Warum bei dir Linux (oder war es KDE?) so langsam war, hat damit nichts zu tun. Bitte nicht immer so dämlich flamen. Nun geh in die Ecke und schäm dich.



  • Das ist mir auch klar, aber ein großes Programm sofort komplett in den RAM zu laden ist ja wohl nicht sehr klug (muss aber, sonst könnte man es nicht löschen), bei wenig RAM, weil es sowieso wieder zum Teil ausgelagert wird. Soviel ich weiß lädt Windows erst nach und nach das Programm, wenn es gebraucht wird, natürlich lädt es nicht jedes Byte einzeln sondern buffert im voraus. (ganz vielicht hab ich das aber in einem Windows 3 - Buch gelesen, das könnte natürlich überholt sein).

    Hast aber recht, dass das nicht der Grund bei mir war, weil ich eingentlich keine so großen Programme gestartet hab, mhhh.



  • Windows 3.x ist eine ganz andere Kategorie. Das kann man nicht als neueres Betriebssystem bezeichnen!



  • D@niel $chumann schrieb:

    Ich finde es schon eigenartig, dass man es überhaupt löschen kann, dann müsste es ja komplett im RAM sein oder zumindest wieder auf die Platte ausgelagert werden, kein Wunder, dass Linux soooooo llaaaahhhhmmmm ist (beziehe mich auf SuSE 9.1 Personal auf PII 0.35GHz 128MB PC100 SDRAM).

    *chr* Auf der Möhre läuft ein WindowsXP mit allen Effekten sicher auch nicht berauschend könnt' ich mir denken... 🕶

    kingruedi schrieb:

    Windows 3.x ist eine ganz andere Kategorie. Das kann man nicht als neueres Betriebssystem bezeichnen!

    Nee, das gehört noch mit zu Minix, OS/2 und anderen Untaten... 🤡



  • Hab es mal ausprobiert: Windows 2000 lädt nicht die ganze Exe auf einmal!

    Sgt. Nukem schrieb:

    Auf der Möhre läuft ein WindowsXP mit allen Effekten sicher auch nicht berauschend könnt' ich mir denken...

    ganz deiner Meinung, ich will es gar nicht ausprobieren 😉 Windows2000 ist das ideale OS für diesen PC.

    Oder halt das RICHTIGE Linux, also SuSE 9.1 schon mal nicht 😞 ( da hab ich wohl SuSE mit Windows 2000 verglichen, tut mir leid , ich geh dann mal in meine Ecke :p )



  • Sgt. Nukem schrieb:

    kingruedi schrieb:

    Windows 3.x ist eine ganz andere Kategorie. Das kann man nicht als neueres Betriebssystem bezeichnen!

    Nee, das gehört noch mit zu Minix, OS/2 und anderen Untaten... 🤡

    Nein, Minix und OS/2 sind definitiv moderner als Windows 3.x von ihrer Architektur, du Nasenbär.



  • kingruedi schrieb:

    Sgt. Nukem schrieb:

    kingruedi schrieb:

    Windows 3.x ist eine ganz andere Kategorie. Das kann man nicht als neueres Betriebssystem bezeichnen!

    Nee, das gehört noch mit zu Minix, OS/2 und anderen Untaten... 🤡

    Nein, Minix und OS/2 sind definitiv moderner als Windows 3.x von ihrer Architektur, du Nasenbär.

    Natürlich.
    Und Windows XP ist wiederum moderner als die beiden.

    Trotzdem kommt meine persönliche "Grausiges-System"-Schwelle erst NACH Minix, OShalbe und Co. 🕶



  • Von der Grundtheorie ist Windows XP nicht moderner als OS/2 und Minix. Vielleicht benutzen die mittlerweile bessere Algorithmen. Aber ansonsten ist da nicht viel neues. DOS und Windows 3.x/9x hinkten eben der Technik so ca. 10-20 Jahre hinter her. MacOS bis zur Version X wohl auch.



  • D@niel $chumann schrieb:

    Hab es mal ausprobiert: Windows 2000 lädt nicht die ganze Exe auf einmal!

    Die exe wird nur auf den 4 GB großen virtuellen Adressraum abgebildet!
    Die gerade benötigten Pages werden bei Bedarf in den RAM geladen. Sobold du versuchst den Code zu verändern kommt das gute alte PAGE_EXECUTE_WRITECOPY Seitenschutzattribut zum tragen und es wird eine Kopie des Execodes angelegt.
    Von da an arbeitest du mit einer Kopie des original Execodes und dieser wird bei einer anstehenden Auslagerung aus dem RAM nicht einfach verworfen(und bei Bedarf von der Festplatte neu geladen) sondern in die Auslagerungsdatei geschrieben.

    MfG Spacelord



  • kingruedi schrieb:

    Von der Grundtheorie ist Windows XP nicht moderner als OS/2 und Minix. Vielleicht benutzen die mittlerweile bessere Algorithmen. Aber ansonsten ist da nicht viel neues. DOS und Windows 3.x/9x hinkten eben der Technik so ca. 10-20 Jahre hinter her. MacOS bis zur Version X wohl auch.

    Jo, ebenso Linux. Diese %&§§/§$% Mischung aus Monolithischem und Core-"Kernel" ist ja echt das letzte!! 🤡



  • Sgt. Nukem schrieb:

    kingruedi schrieb:

    Von der Grundtheorie ist Windows XP nicht moderner als OS/2 und Minix. Vielleicht benutzen die mittlerweile bessere Algorithmen. Aber ansonsten ist da nicht viel neues. DOS und Windows 3.x/9x hinkten eben der Technik so ca. 10-20 Jahre hinter her. MacOS bis zur Version X wohl auch.

    Jo, ebenso Linux. Diese %&§§/§$% Mischung aus Monolithischem und Core-"Kernel" ist ja echt das letzte!! 🤡

    Core-Kernel? Was ist das? Erklär mal bitte.

    Aber Linux ist genau wie die meisten anderen Betriebssystem (alle populären, MacOSX ist da noch am besten) leider ziemlich veraltet. Dafür sind die Algorithmen aber gut. In meinem Kopf habe ich ein paar ziemlich lustige Ideen, wie man ein Betriebssystem moderner und flexibler machen könnte. Aber mein Körper ist wahrscheinlich zu schwach die Umzusetzen. 😞 ("Der Geist ist Stark, nur der Körper ist Schwach"-Problem ;))


Log in to reply