写入文件和mkdir竞争条件C
Writing to file and mkdir race conditions C
我做了一个函数,试图创建一个目录,然后写一个简单的文件:
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.
相关文章:
- compare_exchange C++函数如何确定竞争条件?
- 在C++中写入相同值的竞争条件?
- QByteArray 通过队列连接按值发出并连接并附加到竞争条件?
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 如何修复条件变量等待/通知的竞争条件
- 在没有互斥锁的情况下重新计数时如何避免竞争条件?
- 替代 rand() 以避免竞争条件?
- CUDA 内核中的竞争条件
- 为什么跨线程更改共享变量的代码显然没有受到竞争条件的影响
- 类声明自己(*this)为private以避免竞争条件/放弃在gcc中对threadprivate的请求
- 使用 gtest EXPECT_CALL 时竞争条件段错误,而另一个期望是执行相同的方法
- boost::进程间消息队列创建时的竞争条件
- 如何在没有竞争条件的情况下将 QFutureWatcher 与 QtConcurrent::run() 一起使用
- 为什么 printf 可以屏蔽竞争条件,而系统日志不能?
- 为什么这个代码会产生竞争条件
- 为什么 CUDA 同步点不能阻止竞争条件?
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理
- 如何使用 Boost Atomic 删除竞争条件
- boost::mutex 无法帮助避免C++程序中的竞争条件
- 类中的递归函数或竞争条件