[Python-Dev] os.rename on windows
Scott Dial
scott+python-dev at scottdial.com
Tue May 1 09:33:01 CEST 2007
Raghuram Devarakonda wrote:
> As a last resort, I
> checked cygwin documentation which claims that it's rename() is
> POSIX.1 compliant. If I am not mistaken, POSIX.1 does require
> atomicity so I am curious how rename() is implemented there.
The cygwin implementation of rename goes like this:
1) Try to use MoveFile
2) Try to use MoveFileEx(..., MOVEFILE_REPLACE_EXISTING)
3) Try to unlink destination, then try to use MoveFile
And as you say, Cygwin claims it meets POSIX.1. And, POSIX.1 says, "If
newpath already exists it will be atomically replaced (subject to
a few conditions; see ERRORS below), so that there is no point at which
another process attempting to access newpath will find it missing."
Clearly, unliking and then calling MoveFile is not atomic. So, cygwin is
not being honest here because in these less frequent cases, the rename
will not be atomic.
Also note, MVCRT only tries step 1 of cygwin's version. Which I believe
also suggests that it's the only version that is atomic.
-Scott
--
Scott Dial
scott at scottdial.com
scodial at cs.indiana.edu
More information about the Python-Dev
mailing list