Sto*_*row 3 c c++ filesystems file
我有一个线程,该线程inotify监视目录中是否有文件添加(如果存在,则使用它,否则进行轮询),并在监视的目录中创建新文件时通知侦听器。侦听器具有基于所创建文件的大小的条件逻辑,它使用来确定int stat(const char *pathname, struct stat *statbuf)。
在一个单独的线程中,我使用std :: ofstream创建一个非零长度的文件;文件创建的简化示例是:
std::ofstream ofs( "/path/to/file", std::ofstream::out );
ofs << "abc";
ofs.close()
Run Code Online (Sandbox Code Playgroud)
运行时的行为是,调用的侦听器stat()有时会将文件视为0长度。
这是完全合理的,因为文件创建和内容添加是单独的操作。
问题:有没有一种方法可以使用C函数或C++03的原子地创建非零长度的文件stl?
注意:出于这个问题的目的,我对诸如互斥体或信号量之类的同步原语不感兴趣,该同步原语用于在文件打开,添加内容,关闭文件的整个过程中同步两个线程。
基本的C语言没有这样的概念,我也不认为C ++也有。如果您在谈论这些类型的事情,那么您必须假设POSIX或其他一些操作系统级别的行为规范。
在POSIX下,执行此操作的方法是使用临时名称创建文件,然后rename仅在完成写入后再进行创建。如果它们都在同一设备上,则可以在不同的目录中执行此操作;如果它们在不同的设备上,则是否可行由实现定义。最可移植的方法是在同一目录中执行此操作,这意味着您的inotify(Linux专用的BTW)侦听器应忽略与正在查找的命名模式不匹配的文件,或忽略您选择作为约定的特定临时命名空间中的文件。
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |