写入文件和mkdir争用条件C

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

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.