On Mon, Oct 07, 2024 at 09:52:06PM +1100, Viktor Dukhovni wrote: > If you need to know whether the file got created by this call, or was > found to exist already, you need a lower-level API, such as (Unix C): > > /* In some cases 0600 is more appropriate */ > int fd = open(path, O_WRONLY|O_CREAT|O_EXCL, 0666); > > if (fd >= 0) { > /* Just created */ > (void) close(fd); > ... > } else if (errno == EEXIST) { > /* Already present */ > ... > } else { > /* Permission or other problem */ > ... > }
I should mention that The above assumes a "local" filesystem, with NFS a race may still be possible, and the open(2) manpage may describe work-arounds, e.g. Linux: On NFS, O_EXCL is supported only when using NFSv3 or later on kernel 2.6 or later. In NFS environments where O_EXCL support is not provided, programs that rely on it for performing locking tasks will contain a race condition. Portable programs that want to perform atomic file locking using a lockfile, and need to avoid reliance on NFS support for O_EXCL, can create a unique file on the same filesystem (e.g., incorporating hostname and PID), and use link(2) to make a link to the lockfile. If link(2) returns 0, the lock is successful. Otherwise, use stat(2) on the unique file to check if its link count has increased to 2, in which case the lock is also successful. -- Viktor. _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs