gpt4 book ai didi

c++ - C/C++ : is there a way to create a nonzero-length file atomically?

转载 作者:太空狗 更新时间:2023-10-29 19:45:13 24 4
gpt4 key购买 nike

我有一个线程监视文件添加的目录(如果存在则使用 inotify,否则轮询),并在监视目录中创建新文件时通知监听器。监听器具有基于所创建文件大小的条件逻辑,它使用 int stat(const char *pathname, struct stat *statbuf) 确定。

在一个单独的线程中,我使用 std::ofstream 创建了一个非零长度文件;文件创建的一个简化示例是:

std::ofstream ofs( "/path/to/file", std::ofstream::out );
ofs << "abc";
ofs.close()

运行时行为是调用 stat() 的监听器有时会将文件视为 0 长度。

这是完全合理的,因为文件创建和内容添加是分开的操作。

问题:有没有一种方法可以使用 C 函数或 C++03STL< 自动创建非零长度文件?

注意:为了这个问题的目的,我对同步原语不感兴趣,比如互斥锁或信号量,围绕文件打开、添加内容、关闭文件的整个过程同步两个线程。

最佳答案

基础 C 语言没有这样的概念,我认为 C++ 也没有。如果您在谈论这些类型的事情,您必须假设 POSIX 或其他一些操作系统级行为规范。

在 POSIX 下,进行这种操作的方法是创建一个临时名称的文件,然后只有在完成写入后才重命名。如果它们都在同一台设备上,您可以在不同的目录中执行此操作;如果它们在不同的设备上,是否有效是实现定义的。最可移植的方法是在同一个目录中进行,这意味着您的 inotify(特定于 Linux,BTW)监听器应该忽略与它正在寻找的命名模式不匹配的文件,或者忽略特定目录中的文件您选择作为约定的临时命名空间。

关于c++ - C/C++ : is there a way to create a nonzero-length file atomically?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57826555/

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