小编Alb*_*o M的帖子

创建新文件以避免竞争条件

我需要开发一个C++例程来执行这个显然是微不足道的任务:只有在文件不存在时才创建文件,否则什么也不做/引发错误.

由于我需要避免竞争条件,我想使用"请求宽恕不允许"原则(即尝试预期的操作并检查它是否成功,而不是提前检查前提条件),据我所知,这是唯一的用于此目的的强大且可移植的方法[维基百科文章] [getline的一个例子].

不过,在我的案例中,我无法找到实现它的方法.我能想到的最好的是打开一个fstreamin app模式(或者fopen"a"),用tellp(C++)或ftell(C)检查输出位置,如果这个位置不为零,则中止.然而,这有两个缺点,即如果文件存在则它被锁定(尽管很短的时间)并且其修改日期被改变.

我检查的其他可能的组合ios_base::openmodefstream,还有mode的字符串fopen,但没有发现这适合我的需求选择.进一步搜索C和C++标准库以及Boost Filesystem,证明是无用的.

有人能否指出一种方法以一种强有力的方式执行我的任务(没有附带效应,没有竞争条件)而不依赖于OS特定的功能?我的具体问题是在Windows中,但便携式解决方案将是首选.

编辑:BitWhistler的答案完全解决了C程序的问题.不过,我很惊讶没有C++惯用解决方案似乎存在.任何一个使用Andrew Henle提出openO_EXCL属性,但是特定于操作系统(在Windows中,属性似乎_O_EXCL用另外的下划线[MSDN]调用)或者单独编译C11文件并将其从C++代码链接.此外,获得的文件描述符不能转换为流,除非使用非标准扩展(例如GCC __gnu_cxx::stdio_filebuf).我希望未来的C++版本能够实现子"x"属性,也可能ios::实现文件流的相应修改器.

c c++ iostream stdio

9
推荐指数
1
解决办法
906
查看次数

标签 统计

c ×1

c++ ×1

iostream ×1

stdio ×1