如果文件不存在,我需要创建一个文件,这样尝试创建此文件的另一个进程将失败。在实际数据写入文件之前,我希望该文件被视为“已创建”。
我了解到使用open()
的O_EXCL
标志似乎可以解决这个问题,但是我有几个问题:
- 您是否具有使用此技术的经验?它有多好?(我想我无法获得数据库级别的原子性,但是足够好就可以)
- 我应该在
open()
后立即关闭文件,以便被认为已创建,然后重新打开进行写入吗? - 有哪些细节需要注意?
如果文件不存在,我需要创建一个文件,这样尝试创建此文件的另一个进程将失败。在实际数据写入文件之前,我希望该文件被视为“已创建”。
我了解到使用open()
的O_EXCL
标志似乎可以解决这个问题,但是我有几个问题:
open()
后立即关闭文件,以便被认为已创建,然后重新打开进行写入吗?POSIX说:
如果设置了O_CREAT和O_EXCL,则open()将失败,如果文件已存在。 对于文件的存在检查以及如果不存在则创建文件应与其他线程原子化执行 在相同目录中使用O_EXCL和O_CREAT设置命名相同的文件的open()。
因此,使用O_EXCL
的其他进程将在创建后立即考虑它已打开。
open()
之后文件是否被认为是“已创建”。这似乎表明是的。 - davka
fcntl
应该可以在 NFS 上工作,因此您可以使用它来在写入时同步您的进程,而不是在打开时。 - aaz