Linux 上的原子文件创建?

发布于 2024-10-20 06:57:38 字数 323 浏览 2 评论 0原文

如果文件不存在,我需要创建一个文件,这样尝试创建该文件的另一个进程就会失败。我需要在创建过程完成向其中写入实际数据之前将该文件视为“已创建”。

我读到了关于 O_EXCL 标志到 open() 的内容,所以似乎解决方案存在,但是我有几个问题:

  1. 您有这种技术的经验吗?有多好? (我想我不能拥有数据库级原子性,但是足够好......好吧,足够了)
  2. 我应该在 open() 之后立即关闭文件,以便将其视为已创建,然后重新打开它进行写入?
  3. 有什么微妙之处需要注意吗?

I need to create a file if it does not exist, in a way that another process trying to create this file would fail. I need the file be considered "created" even before the creating process finished writing the actual data to it.

I read about O_EXCL flag to open(), so it seems that the solution exists, I have a few questions however:

  1. do you have experience with this technique? How good is it? (I guess I can't have a DB-level atomicity, but but good enough is... well, enough)
  2. should I immediately close the file after open() so that it is considered created, and then reopen it for writing?
  3. are there any subtleties to be aware of?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

网名女生简单气质 2024-10-27 06:57:38

open() 手册页 表示您的方法在 NFS 上可能会失败。

来自 O_EXCL 部分:

与 O_CREAT 一起使用时,如果文件
已经存在,这是一个错误,并且
open() 将失败。在此背景下,一个
符号链接存在,无论
它指向哪里。 O_EXCL 已损坏
在 NFS 文件系统上;程序其中
依靠它来执行锁定
任务将包含竞争条件。

它提出了一个更通用的解决方案:

执行原子操作的解决方案
使用锁定文件的文件锁定是
在同一文件上创建唯一的文件
系统(例如,合并主机名
和 pid),使用 link(2) 建立链接
到锁文件。如果 link() 返回 0,
锁定成功。否则,使用
stat(2) 在唯一文件上检查是否
其链接数已增加到 2,
这种情况下锁也是
成功。

请参阅此网页的“使用文件作为锁”部分 了解有关各种问题和方法的更多详细信息。

The open() man page says your method may fail on NFS.

From the section on O_EXCL:

When used with O_CREAT, if the file
already exists it is an error and the
open() will fail. In this context, a
symbolic link exists, regardless of
where it points to. O_EXCL is broken
on NFS file systems; programs which
rely on it for performing locking
tasks will contain a race condition.

And it suggests a more general solution:

The solution for performing atomic
file locking using a lockfile is to
create a unique file on the same file
system (e.g., incorporating hostname
and pid), use link(2) to make a link
to the lockfile. If link() returns 0,
the lock is successful. Otherwise, use
stat(2) on the unique file to check if
its link count has increased to 2, in
which case the lock is also
successful.

See the "Using Files as Locks" section of this Web page for more details on the various issues and approaches.

旧城烟雨 2024-10-27 06:57:38

POSIX 说:

如果设置了 O_CREAT 和 O_EXCL,则当文件存在时 open() 将失败。
检查文件是否存在并创建文件
它不存在对于其他线程来说应该是原子的
执行 open() 在同一目录中命名相同的文件名
O_EXCL 和 O_CREAT 设置。

因此其他使用O_EXCL的进程会认为它一创建就打开了。

POSIX says:

If O_CREAT and O_EXCL are set, open() shall fail if the file exists.
The check for the existence of the file and the creation of the file if
it does not exist shall be atomic with respect to other threads
executing open() naming the same filename in the same directory with
O_EXCL and O_CREAT set.

So other processes using O_EXCL will consider it opened as soon as it is created.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文