Nach den Kommentaren zu einer meiner Fragen bin ich gespannt, was passiert, wenn man eine ausführbare Datei überschreibt. Ich muss mein Verständnis in dieser Angelegenheit überprüfen.Was passiert, wenn Sie eine speicherprogrammierbare ausführbare Datei überschreiben?
Sag ich habe /usr/bin/myprog
. Ich betreibe es und so lädt das OS /usr/bin/myprog
, wahrscheinlich über http://en.wikipedia.org/wiki/Memory-mapped_file#Common_uses.
Aus welchem Grund auch immer dieser Prozess im Speicher bleibt und ich entscheide tatsächlich habe ich einen Fehler behoben und überschreiben /usr/bin/myprog
.
Also, soweit ich es verstehe:
- Wenn eine Instanz von
myprog
bereits geladen ist und ich ersetzen Sie die Datei, von dermyprog
bereits geladen wurde, ist die Instanz vonmyprog
unverändert. - Wenn ich eine neue Instanz von
myprog
ausführen, wird es den neuen Code verwenden.
Bin ich richtig?
Gemäß dem Artikel zu Memory-Mapped-Dateien ermöglicht eine solche Technik einem Entwickler jedoch, Teile einer Datei so zu behandeln, als wären sie physischer Speicher.
So sehe ich einen Widerspruch darin, wie ich die Dinge verstand. Wenn Seiten wirklich nur bei Bedarf geladen werden, dann wird unter der Annahme, dass myprog
nicht zu 100% ausgelagert ist, dieser Wikipedia-Artikel impliziert, dass neue Seiten von der Datei auf der Platte geladen werden, die seit dem Laden des Originalbildes geändert wurde.
Ich bin mir jedoch ziemlich sicher, dass meine beiden kompilierten Bilder nicht die gleichen wären und dass die relevanten Adressoffsets für jede Datei nicht identisch sind. Unter der Annahme, dass dies der Fall ist, wird der Befehlszeiger sehr verloren gehen ... Ich bin ziemlich sicher, dass ein Betriebssystem Teile von zwei verschiedenen Bildern nicht als Teil des gleichen Prozesses in den Speicher lädt.
Wie also funktioniert die Kombination von Memory-Mapping/Demand-Paging für die Ausführung von Programmen, bitte? Würde das Überschreiben dieser Datei einen Seitenfehler auf jeder der ausführbaren Seiten auslösen, um sicherzustellen, dass sie für den gerade laufenden Prozess geladen ist?
habe ich einen schnellen Versuch mit diesem:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv)
{
printf("Program resident...");
while(1)
{
printf("??? Just notifying you I'm still here...\n");
usleep(1000000);
}
return 0;
}
Und sicher genug, um a) ersetzen diese ausführbare Datei konnte ich während es ausgeführt wurde und b) seine Ausgabe nicht verändert wird.
SO was ist los? Ich würde mich über Anregungen freuen, was ich tun kann, um zu sehen, was passiert (Linux oder Windows).
Vielen Dank.
Edit: Frage, auf die ich bezog, dass diese Frage ausgelöst: Upgrades without reboot - what kinds of problems happen in practice?
Auch ich bin mir bewusst, dies speziell bezieht sich nicht auf die Programmierung, aber das Ergebnis eine ausführbare Datei zu aktualisieren. Ich bin jedoch immer noch interessiert und ich kann mir keinen besseren Ort dafür vorstellen.
Ich verstehe. Paketmanager sind sich bewusst, dass der Prozess ... interessant ist. Gut. Ich denke, das beantwortet es, kombiniert mit Teds Antwort weiß ich jetzt viel mehr darüber, was tatsächlich passiert. –
Für das, was es wert ist, gilt dies auch für OS X (und BSD im Allgemeinen) und ist in posix gut definiert, siehe "unlink (2)". – elslooo