Die Erklärung bei
http://man7.org/linux/man-pages/man2/open.2.html
über die Notwendigkeit openat
lautet auszugsweise:
openat() allows an application to avoid race conditions that
could occur when using open() to open files in directories other than
the current working directory. These race conditions result from the
fact that some component of the directory prefix given to open()
could be changed in parallel with the call to open(). Suppose, for
example, that we wish to create the file path/to/xxx.dep if the file
path/to/xxx exists. The problem is that between the existence check
and the file creation step, path or to (which might be symbolic
links) could be modified to point to a different location.
Ich verstehe nicht, warum dieses Rennen ein Problem ist. Wenn eine App die Existenz einer Datei prüfen und in diesem Fall eineandersDatei, dann sind das natürlich zwei Schritte, und die App sollte und kann sicherstellen, dass nichts dazwischen kommt. Nur wenn ein einzelner Aufruf open()
einen Race Condition verursachen könnte, könnte ein anderer Systemaufruf wie openat()
erforderlich sein. Andernfalls ist dies nicht durch Systemaufrufe zu lösen, sondern liegt in der Verantwortung der Anwendung.
Was verstehe ich hier nicht?
Antwort1
Das Race bezieht sich nur auf Dateien, die sich nicht im aktuellen Verzeichnis befinden. Der relative Pfad, den Sie an openat() übergeben, könnte einen symbolischen Link enthalten, der auf ein anderes Verzeichnis als das erwartete verweist.
Wenn Sie open() nur mit Dateien im aktuellen Verzeichnis verwenden (nachdem Sie sichergestellt haben, dass Sie dort sind, wo Sie sein möchten), vermeiden Sie dieses Problem.