【问题标题】:problems with the open() function in different file permissions不同文件权限下 open() 函数的问题
【发布时间】:2015-05-04 15:01:27
【问题描述】:

我正在用 C 语言实现虚拟磁盘系统,其中还包括处理文件系统。我只是想知道,为什么当我尝试打开具有group 权限或others 权限的文件时,C 中的open 函数返回-1。

假设我们的文件模式为 040(文件组所有者的读取权限位):

int main(){
    int filedes;
    filedes = open(filename, O_RDWR, 040);
    if(filedes < 0)
        return -1;

    printf("Open success\n");    

}

这个sn-p返回而不打印打开成功。文件模式为 0644 的这段代码工作得很好

int main(){
    int filedes;
    filedes = open(filename, O_RDWR, 0644);
    if(filedes < 0)
        return -1;

    printf("Open success\n");    

}

我不明白为什么会这样?

【问题讨论】:

  • mode 参数在这里不应该做任何事情,因为它只影响新创建的文件。如果未指定 O_CREAT,则忽略它。运行此代码之前,现有文件的权限是什么?
  • 我创建了具有相同权限 (040) 的文件,带有 O_CREAT 标志。
  • 那你不能以O_RDWR打开它,因为它是只读的。正如我所说,除非您正在创建文件,否则您不需要指定模式。
  • 那么我应该怎么做才能阅读它的内容呢?

标签: c


【解决方案1】:

040 明确禁止所述文件的所有者对其进行任何操作。即使您的组可以,但您已明确定义您自己的用户不能使用它。这可能看起来很奇怪,但操作系统只会执行您告诉它做的事情。

【讨论】:

  • 但据我所知,040 只允许组所有者“读取”文件。那么如果某些用户可以读取文件,操作系统如何拒绝打开它呢?
  • @AhmedDhanani 因为您已明确定义所有者的访问级别为 0。用户特定规则比组规则更重要,组规则比所有人规则更重要。它们会覆盖以前的,而不是增强它们。
  • 也就是说,如果我尝试以其他人的读取权限打开此函数 (04),此函数将再次返回 -1?
  • @AhmedDhanani 你从哪里得到的 open 应该返回 -1?规范仅定义如果出现问题将返回负数,而不是 -1。
  • @AhmedDhanani 欢迎。我知道这可能是违反直觉的,最后假设它只会附魔特权,而不是潜在地减少特权是合乎逻辑的,但它可以在覆盖的基础上工作,最左边的相关值是最重要的.
猜你喜欢
  • 2011-03-22
  • 2015-08-28
  • 2014-10-13
  • 1970-01-01
  • 2011-09-17
  • 2012-01-05
  • 2010-11-14
相关资源
最近更新 更多