Wie funktioniert die Verwendung von try-Anweisung vermeiden Sie eine race-condition?
Bei der Bestimmung, ob eine Datei vorhanden ist, wie wirkt sich die Verwendung von try-Anweisung vermeiden Sie eine "race condition"?
Ich Frage deshalb, weil ein hoch von Ihnen positiv bewertet werden Antwort (update: es wurde gelöscht) scheint zu implizieren, dass die Verwendung os.path.exists()
schafft eine Möglichkeit, dass würde sonst nicht gegeben sind.
Beispiel gegeben ist:
try:
with open(filename): pass
except IOError:
print 'Oh dear.'
Aber ich bin nicht zu verstehen, wie, die vermeidet, dass eine race-condition im Vergleich zu:
if not os.path.exists(filename):
print 'Oh dear.'
Wie funktioniert das aufrufen os.path.exists(filename)
dem Angreifer ermöglichen, etwas zu tun, was mit der Datei, die Sie nicht bereits tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Race-Bedingung ist natürlich, zwischen Ihrem Programm und einige andere code funktioniert auf file ("race" - Bedingung erfordert immer mindestens zwei parallele Prozesse oder threads, siehe diese für details). Das bedeutet, dass mit
open()
stattexists()
wirklich helfen kann nur in zwei Situationen:exists()
nur führt eine einzelne Prüfung. Wenn die Datei besteht, kann es gelöscht werden, eine Mikrosekunde nachexists()
zurückgegebenTrue
. Wenn die Datei fehlt, es kann sofort erstellt werden.Jedoch
open()
nicht nur tests für die Datei Existenz, sondern auch die Datei geöffnet (und macht diese beiden Aktionen atomar, so kann nichts passieren zwischen den check-in und die öffnung). In der Regel Dateien können nicht gelöscht werden, während Sie offen sind, von jemand. Das bedeutet, dass innerhalbwith
können Sie völlig sicher sein: die Datei wirklich existiert, jetzt, da es offen ist. Obwohl es wahr ist, die nur innerhalbwith
, und die Datei noch gelöscht werden können, die unmittelbar nachwith
- block vorhanden, putting-code-Datei gibt es inwith
garantiert, dass der code nicht scheitern.Hier ist ein Beispiel für die Verwendung:
Wenn Sie öffnen die Datei mit einem beliebigen Zugang zu allen, dann wird das OS garantiert, dass die Datei existiert, sonst wird es zu einem Fehler. Wenn der Zugriff ist exklusiv, alle anderen Prozesse, die im Kampf um die Datei wird entweder blockiert oder blockieren Sie.
Den
try
ist nur ein Weg, um den Fehler zu erkennen oder den Erfolg der Akt des öffnens der Datei, da die Datei-I/O-APIs in Python in der Regel nicht über return-codes (Ausnahmen werden stattdessen verwendet). Also wirklich deine Frage zu beantworten, es ist nicht dietry
, die vermeidet, dass die race-condition, es ist dasopen
. Es ist im Grunde das gleiche in C (auf dem Python-basiert), aber ohne Ausnahmen. Lesen diese für weitere Informationen.Beachten Sie, dass Sie wahrscheinlich wollen, um code auszuführen, das hängt davon ab, Zugriff auf die Datei innerhalb des try-Blocks. Sobald Sie die Datei schließen, seine Existenz ist nicht mehr gewährleistet.
Aufrufen
os.path.exists
gibt lediglich eine Momentaufnahme zu einem Zeitpunkt, wenn die Datei möglicherweise oder möglicherweise nicht vorhanden, und Sie haben keine Kenntnis von der Existenz der Datei nachos.path.exists
gibt. Bösartigen code oder unerwartete Logik kann löschen oder ändern Sie die Datei, wenn Sie nicht erwartet. Es ist ähnlich drehen Sie Ihren Kopf, um zu überprüfen, dass eine Straße deutlich vor, Sie fahren in es. Sobald Sie drehen Sie den Kopf zurück, haben Sie nichts, aber eine Vermutung über das, was Los ist, wo man nicht mehr suchen. Hält die Datei zu öffnen garantiert eine erweiterte konsistenten Zustand, etwas, das nicht möglich ist (zum guten oder zum schlechten), wenn der Fahrt. 🙂Ihren Vorschlag zu überprüfen, dass eine Datei nicht vorhanden ist, anstatt mit
try/open
ist immer noch unzureichend, weil der snapshot Naturos.path.exists
. Leider kenne ich keinen Weg, um zu verhindern, dass Dateien in einem Verzeichnis in allen Fällen, so denke ich, ist es am besten, um zu überprüfen, für die positive Existenz einer Datei, sondern seine Abwesenheit.Ich denke, das was du fragst ist die Besondere Wettkampfsituation wo:
Dem Weg bist du "geschützt" in diesem Fall ist, indem Sie alle Datei-handling-code in eine
try
blockieren, wenn zu irgendeinem Zeitpunkt die Datei nicht mehr zugegriffen werden/beschädigt Ihre Datei-Operationen werden in der Lage sein zu scheitern "ordnungsgemäß" über diecatch
block.Hinweis natürlich moderne Betriebssysteme, das kann nicht passieren, jedenfalls, wenn eine Datei "gelöscht" das löschen wird nicht stattfinden, bis alle offene handles auf die Datei gelöst (freigegeben)