Der schnellste und sicherste Weg, auf das Vorhandensein von Dateien zu testen, ist es, überhaupt nicht separat/explizit darauf zu testen. Das heißt, versuchen Sie, eine Möglichkeit zu finden, die gewöhnliche
if(exists(file)) { /* point A */
/* handle existence condition */
return;
}
do_something_with(file); /* point B */
mit dem verbesserten
r = do_something_with_unless_exists(file);
if(r == 0)
success;
else if(errno == EEXIST)
/* handle existence condition */
else
/* handle other error */
Dies ist nicht nur schneller, sondern eliminiert auch die Rennbedingung (konkret: " TOC/TOU "), die der ersten Lösung innewohnt, nämlich die Möglichkeit, dass die Datei zwischen Punkt A und Punkt B zustande kommt.
Die zweite Lösung setzt natürlich voraus, dass es einen atomaren Weg gibt, die do_something_with_unless_exists
Betrieb. Oft gibt es einen Weg, aber manchmal muss man ihn erst suchen.
-
Erstellen einer Datei: Aufruf open()
con O_CREAT
y O_EXCL
.
-
Erstellen einer Datei in reinem C, wenn Sie C11 haben: Aufruf fopen()
con "wx"
. (Ich habe erst gestern davon erfahren.)
-
Ein Verzeichnis erstellen: einfach anrufen mkdir()
und prüfen auf errno == EEXIST
danach.
-
Erwerb einer Sperre: Jedes brauchbare Sperrsystem verfügt bereits über ein atomares Primitiv zum Erwerb der Sperre, solange niemand sonst sie hat.
(Es gibt noch andere, aber das sind die, die mir gerade einfallen.)
[Fußnote: In den frühen Tagen von Unix gab es keine speziellen, dedizierten Einrichtungen, die gewöhnlichen Prozessen zur Verfügung gestellt wurden, um Sperren einzurichten. Wenn Sie also einen Mutex einrichten wollten, wurde dies typischerweise durch die Erstellung eines bestimmten leeren Verzeichnisses implementiert, da die mkdir
syscall war schon immer in der Lage, auf der Grundlage der vorherigen Existenz oder Nichtexistenz zu scheitern oder erfolgreich zu sein, und zwar atomar].