Kann man unter Linux ein Programm löschen, während es ausgeführt wurde? Und warum, was steckt dahinter?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ja, das geht unter Linux problemlos und sehr zuverlässig, weil das System im Gegensatz zu Windows Filedescriptoren und Filedescripions unterscheidet.

Deshalb kann man unter Linux auch ohne Probleme Dateien im Betrieb patchen, was unter Windows nicht ohne weiteres möglich ist. (Deshalb bei Windows die vielen nervigen Neustarts!)

Folgendes Programm löscht sich selbst:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) {
puts("foo bar baz");

unlink(argv[0]);

return 0;
}

Eine Erklärung, wie File-Descriptioren / -Descriptions funktionieren würde hier den Rahmen sprengen, und reißt die Funktionsweise von Dateisystemen und dem Linux-Kernel an, weshalb ich mir das jetzt mal sparen werde.

Fazit: Unter Windows nur sehr unschön und mit argen Kopfständen möglich, unter Linux hingegen ein eleganter Einzeiler. :)

Viel Spaß! :)

Disclaimer: Ja, ich weiß dass argv[0] manipulierbar ist, aber der Einfachheit halber ist das bei obigem Code-Schnipsel völlig ausreichend. :)

0

Nun würde mich das mit den File-Descriptoren und Descriptions doch interessieren, aber naja dann weiss ich was ich nun zu googlen habe^^

1

in den Antworten und Kommentaren geht so manches drunter und drüber.

Das fangt damit an, was der eine oder andere unter "Programm" versteht.
Einmal ist es der Quellcode (auch ein Script) und dann wieder das Binary, ein lauffähiges Programm.

Man kann also durchaus am Programm arbeiten und zwischenzeitlich das zugehörige Binary löschen. Ein neuer Aufruf geht dann natürlich nur, wenn es wieder in ein Binary übersetzt wurde.
Ähnlich ist es mit Script-Programmen. Wurde der Code in den Buffer eines Editors geladen, dann lässt sich die ursprüngliche Quelldatei auch löschen.
Wenn der Editor mit "save" verlassen wird, ist die Datei wieder da (man kann aber auch reinfallen, wobei die meisten Editoren vorher ein Backup anlegen).

Binaries, also ausführbare Programme werden normalerweise beim Start vollständig in den RAM geladen. Dadurch, dass viele Funktionen in Bibliotheken liegen, wird der Speicherplatzbedarf stark reduziert und es wird in den RAM passen, wenn nicht, wird in den SWAP (also auf die Festplatte) ausgelagert. Mit dem Platz der Datei auf der Platte hat das aber nichts zu tun.

Ist der Code einmal im RAM, kann auch die Code-Datei (das Binary) gelöscht werden. Zurückspeichern geht da aber nicht.

Warum machst du es mit deinem parallelem Laufen so kompliziert?
Erzeuge doch einfach ein Binary mit einem neuen Namen.

Die Programmiersprache und Compiler hast du leider nicht verraten.
Mit z.B. C/C++ und gcc musst du doch nur mit

gcc  ....  -o neuesBinary   

einen anderen Namen (default a.out ) angeben.

ich finde es am einfachsten mit make (binary löschen, und neu kompilieren) und make do (führe das Programm aus) zu arbeiten, da ist der Name der Binary fest im Makefile verankert.

Weitere Gründe habe ich schon wo anders gegeben. Ich will halt nicht für jeden neuen Aufruf nen neuen Namen eingeben, das soll so funktionieren immer unter den selben Namen.

0

Unter Windows könnte man ein Programm, was gerade ausgeführt wird, weder löschen noch umbenennen. Deshalb nehme ich an, dass es unter Linux ebenso ist.

Unabhängig davon, warum hängst Du dem Namen der neuen Instanz nicht einfach eine laufende Nummer an, dann stellt sich das Problem nicht.

Weil ich das Programm beim programmieren ständig verändere, wenn ich jedesmal nach der Laufnummer schauen muss nachdem ich das Programm kompiliert habe, umbenenne und dann erst ausführe habe ich insgesamt mehr Arbeit mit den Laufnummern, als mit dem Programmieren.

Ausserdem möchte ich den Ordner nicht mit 1000 Versionen des Programms zumüllen, nur weil ich ab und zu mal ein Programm laufen lassen möchte, während ich das nächste schon mache.

Da ich selbst an dem Programm arbeite passiert das sehr sehr oft, dass sich das Programm ändert.

P.s. es scheint bisher zu funktionieren, möchte nur ausschliessen, dass mich ungewollte Seiteneffekte überraschen und verstehen wieso das kein Problem ist oder eben doch ein Problem werden könnte.

0
@DinoMath

Wenn das unter Linux funktioniert, wird wohl das gesamte Programm in den Speicher geladen, und die Programmdatei anschliessend wieder frei gegeben.

Seiteneffekte wären nur dann zu erwarten, wenn das Betriebssystem das Programm erneut laden würde (Speicherplatzverschiebung usw.). Aufgrund der RAM-Grösse der aktuellen Rechner ist das sehr unwahrscheinlich.

1

Deshalb nehme ich an, dass es unter Linux ebenso ist.

Linux und seine Dateisysteme funktionieren grundlegend anders und es geht tatsächlich! :)

2

Was möchtest Du wissen?