gpt4 book ai didi

c++ - 创建一个新文件避免竞争条件

转载 作者:可可西里 更新时间:2023-11-01 16:42:11 26 4
gpt4 key购买 nike

我需要开发一个 C++ 例程来执行这个看似微不足道的任务:仅当文件不存在时才创建文件,否则什么都不做/引发错误。

因为我需要避免竞争条件,我想使用“请求原谅而不是许可”原则(即尝试预期的操作并检查它是否成功,而不是提前检查先决条件),据我所知,是用于此目的的唯一可靠且可移植的方法[Wikipedia article] [an example with getline] .

仍然,我找不到在我的案例中实现它的方法。我能想到的最好办法是打开一个 fstreamapp模式(或 fopen ing with "a" ),用 tellp 检查输出位置(C++) 或 ftell (C) 如果该位置不为零则中止。然而,这有两个缺点,即如果文件存在,它会被锁定(虽然时间很短)并且它的修改日期会被更改。

我检查了 ios_base::openmode 的其他可能组合对于 fstream ,以及 mode fopen 的字符串但找不到适合我需要的选项。在 C 和 C++ 标准库以及 Boost 文件系统中的进一步搜索证明没有结果。

有人能指出一种不依赖特定于操作系统的功能以稳健的方式(没有附带影响,没有竞争条件)执行我的任务的方法吗?我的具体问题是在 Windows 中,但首选可移植解决方案。

编辑:BitWhiSTLer 的回答完全解决了 C 程序的问题。尽管如此,令我惊讶的是似乎不存在 C++ 惯用的解决方案。两者都使用 openO_EXCL Andrew Henle 提出的属性,但是它是特定于操作系统的(在 Windows 中,属性似乎被称为 _O_EXCL 带有额外的下划线 [MSDN] )或者单独编译 C11 文件并将其从 C++ 代码链接。此外,获得的文件描述符无法转换为流,除非具有非标准扩展名(例如 GCC 的 __gnu_cxx::stdio_filebuf )。我希望 C++ 的 future 版本将实现 "x"子属性,也可能是相应的 ios::文件流修饰符。

最佳答案

新的 C 标准(C2011,它不是 C++ 的一部分)添加了一个新的标准子说明符(“x”),它可以附加到任何“w”说明符(形成“wx”、“wbx”、“w+x”或“w+bx”/“wb+x”)。如果文件存在,此子说明符会强制函数失败,而不是覆盖它。

来源:http://www.cplusplus.com/reference/cstdio/fopen/

关于c++ - 创建一个新文件避免竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35696862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com