【问题标题】:The execution of open when using O_CREAT使用 O_CREAT 时 open 的执行
【发布时间】:2019-11-12 18:12:54
【问题描述】:

我正在尝试了解操作系统的一些基础知识,但我陷入了标志和权限之间。

如果open() 使用以下方式 int fd = open(path, O_CREAT | O_RDWR, 0000); 在什么条件下我们的文件会有 0000 权限,在什么条件下我们的文件会有 0666 条件?

一开始我以为如果文件已经创建,我们会以0000权限使用它,如果它没有被创建,将被创建并使用0666权限。我不确定我是否正确。

【问题讨论】:

  • 不。权限参数仅在创建文件时使用。如果已经存在,则文件的权限不变,调用open()中的模式将被忽略。

标签: c linux operating-system file-permissions file-descriptor


【解决方案1】:
  • 如果此打开命令正在创建新文件,则此处仅适用 mode=0000。
  • 如果文件已经存在,那么 mode 的值是什么无关紧要。

这里您使用的是 mode=0000。如果文件不存在,那么它将分配“0000”权限,这意味着没有人(用户、组、其他)具有任何读|写|执行权限。 请使用正确的模式值。

【讨论】:

  • 请注意,在创建文件时完全允许使用模式 0。文件描述符将能够读取和写入文件,但没有其他进程能够打开它进行读取或写入,除非它(ab)使用“适当的权限”(大约是“root 权限”) - 或更改权限在打开文件之前保存它。
  • 我从来没有说过文件描述符不能使用文件。通常,我们创建其他用户、组可以访问的文件。这就是我上面提到使用正确模式的原因。
  • 嗯;我总是将umask 设置为至少022(因此默认情况下,组和其他人无法修改我创建的文件)。我有时与027 合作过(其他人无法访问,团体无法写信)。而且我很少希望创建具有执行权限的文件——如果我要执行某些东西,我会设置执行位,所以033037 有一些优点——甚至133137(但是创建的目录存在问题-您需要对目录具有执行权限才能访问其中的文件(和目录等)。
  • 另外注意我没说你说文件描述符不能用。我刚刚指出,创建文件的权限不会影响文件描述符上请求的访问模式(只读、只写、读/写)。当然,对预先存在的文件的权限确实会影响请求的访问模式。
  • 我在考试中遇到过这类题,所以没用。标志 O_RDWR 在那里有什么作用吗?
猜你喜欢
  • 2018-10-31
  • 2011-02-04
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 2017-12-15
  • 2021-12-10
  • 2020-12-24
相关资源
最近更新 更多