0

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

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 和写入操作会发生什么情况?

4

1 回答 1

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.
于 2017-02-23T17:08:42.190 回答