- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为 open(3)
中列出的不同文件标志编写一个安全的 enum class
,当我发现我找不到写出的单词时对于 O_EXCL
。
enum class Flags {
readOnly, // O_RDONLY
truncate, // O_TRUNC
? // O_EXCL
};
我想到了两种可能的含义:
OPEN_EXCLUSIVE
OPEN_EXISTS_CLOSE
但是我找不到关于预期含义的任何资源。
最佳答案
O_EXCL
的真正含义是“如果创建和文件存在则出错”,但名称源自“EXCL
usive ”,这有点误导,导致许多人误解该标志。
使用 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/
我正在为 open(3) 中列出的不同文件标志编写一个安全的 enum class,当我发现我找不到写出的单词时对于 O_EXCL。 enum class Flags { readOnly,
在 Linux 上的 C 中有没有办法只写入一个已经存在的文件?换句话说,与 open(..., O_CREAT|O_EXCL) 相反。 请注意,我不希望存在性检查与文件的实际打开分离(例如预先调用
在 Linux 2.6 内核和 NFSv3 中,open("fname", O_CREAT|O_EXCL) 何时生效?当前规范的 open(2) 系统调用文档 ( http://www.kernel.
给定以下代码(应该在“helloworld”文件中写入“helloworld”,然后读取文本): #include #include #include #define FNAME "hellow
我正在将一些代码从 Win32 移植到使用锁定文件的 Linux。我用 open 为 Linux 做了一个实现,但我不确定如果文件在 Samba 共享上它是否会工作。我试过了,它似乎可以正常工作,但我
我是一名优秀的程序员,十分优秀!