写入文件和mkdir竞争条件C

Writing to file and mkdir race conditions C

本文关键字:竞争 条件 mkdir 文件      更新时间:2023-10-16

我做了一个函数,试图创建一个目录,然后写一个简单的文件:

buffer = "Hello world!";
string url = "a/b/c/d/";
string tmp = "";
string done = "";
while((tmp = GetBaseDir(url)).compare("")!=0){
    done+=tmp;
    mkdir(done.c_str(), 0777);
} // GetBaseDir returns "a/", and changes url to "b/c/d/"
ofstream file;
file.open((url+"file.txt").c_str(),ios::trunc);
file << buffer;
file.close();

正如你所看到的,它只是尝试,如果出现故障,它就会继续

我读到,如果另一个进程以写权限打开同一个文件,"打开"将失败。但是,这是真的吗
如果我同时运行此代码的多个实例,mkdir和写入操作会发生什么?

手册页指出,当目录已经存在时,mkdir将失败。它返回-1而不是0。如果忽略了这一点,那么只要a/b/c/d实际上是目录,代码通常就可以正常工作。竞争过程可能会将它们创建为其他东西,从而导致错误。目前尚不清楚您为什么使用0777模式,因为使用0700甚至0770与特殊组会更好。如果您确信它们将始终是目录,那么代码的每个实例都将确保dir路径存在,并且唯一的争用将是创建文件。

NAME
   mkdir -- make a directory file
SYNOPSIS
   #include <sys/stat.h>
   int mkdir(const char *path, mode_t mode);
RETURN VALUES
   A 0 return value indicates success.  A -1 return value indicates an
   error, and an error code is stored in errno.
ERRORS
     Mkdir() will fail and no directory will be created if:
   ...
   [EEXIST]           The named file exists.