gpt4 book ai didi

c++ - O_EXCL 写出来的字是什么

转载 作者:太空宇宙 更新时间:2023-11-04 10:12:11 24 4
gpt4 key购买 nike

我正在为 open(3) 中列出的不同文件标志编写一个安全的 enum class,当我发现我找不到写出的单词时对于 O_EXCL

enum class Flags {
readOnly, // O_RDONLY
truncate, // O_TRUNC
? // O_EXCL
};

我想到了两种可能的含义:

  • OPEN_EXCLUSIVE
  • OPEN_EXISTS_CLOSE

但是我找不到关于预期含义的任何资源。

最佳答案

O_EXCL 的真正含义是“如果创建和文件存在则出错”,但名称源自“EXCLusive ”,这有点误导,导致许多人误解该标志。

使用 O_EXCL 打开文件将不会授予您独占访问权限,正如某些人错误地假设的那样。由一个进程使用 O_EXCL 打开的文件可以由其他进程同时打开以进行读取甚至写入,没问题,因此访问显然不是独占的。

这个标志存在的主要原因是“锁定文件”。早在出现文件建议锁定(使用 fcntl)和可以在进程间共享的信号量/互斥量之前,就需要一种简单的方法来确保跨多个进程对某些系统资源进行原子访问。实现锁定文件的方法。想要访问资源的第一个进程将在 /var/lock 中创建一个锁定文件以声明对该资源的所有权,并在完成后再次删除它。其他进程将监视该目录,从而知道资源是否可用。

问题:如果两个进程查看目录,都发现某个文件不存在,所以资源可用,现在都尝试创建这个文件,如何确保两者中只有一个会成功?这就是 O_EXCL 发挥作用的地方。如果他们都尝试创 build 置了 O_EXCL 的文件,则此操作只会对其中一个成功,也就是现在拥有资源锁的进程。

所以 O_EXCL 不是为了获得对文件的独占访问,它是为了制作独占访问文件,其目的是规范对某种资源的独占访问。

今天 O_EXCL 的第二个最重要的用途是文件访问安全。考虑这种情况:一个 root 进程想要创建一个文件并用只有 root 用户才能看到的内容填充它,而不是普通用户,但是它在一个普通用户有写入权限的目录中创建它(例如/tmp)。如果进程将创建文件如下

open("/tmp/root-only", O_CREAT | O_WRONLY, 0600);

并且该文件不存在,它是创建的,归root所有,只有root有读写权限,所以普通用户看不到它的内容。任务完成。

但是如果普通用户之前已经创建了/tmp/root-only呢?然后这个文件归那个用户所有,这个用户可以读取它并且上面的 open 调用只会打开现有文件。即使根进程在打开文件后直接更改了所有权和文件权限,这对之前已经打开文件的进程也没有影响(例如 tail -f)。

所以实现这种情况的正确方法实际上是:

unlink("/tmp/root-only"); // best effort, may not even exist
open("/tmp/root-only", O_CREAT | O_EXCL | O_WRONLY, 0600);

如果 open 确实成功,进程可以依赖该文件由进程所有者拥有,其他任何人都没有读取/写入它的访问权限。

关于c++ - O_EXCL 写出来的字是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48388212/

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