写入文件和mkdir竞争条件C.

时间:2013-02-13 23:39:05

标签: c++ linux race-condition mkdir

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

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();

正如你所看到的,它只会尝试,如果失败,它会继续下去。

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

1 个答案:

答案 0 :(得分:0)

手册页说明当目录已存在时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.