If I want to rename A
to B
, but only if B
doesn't exist, the naive thing would be checking if B
exists (with access("B", F_OK)
or something like that), and if it doesn't proceeding with rename
. Unfortunately this opens a window during which some other process might decide to create B
, and then it gets overwritten - and even worse there's no indication that something like that ever happened.
Other file system access functions don't suffer from this - open
has O_EXCL
(so copying files is safe), and recently Linux got an entire family of *at
syscalls that protect against most other race conditions - but not this particular one (renameat
exists, but protects against an entirely different problem).
So does it have a solution?