【问题标题】:Difference between access() with F_OK|R_OK and checking NULL pointer?带 F_OK|R_OK 的 access() 和检查 NULL 指针之间的区别?
【发布时间】:2021-04-19 20:32:10
【问题描述】:

我想打开一个文件,但可能会发生三种情况:

  1. fopen() 不会分配所有内容(例如内存限制)。
  2. 文件不存在。
  3. 我没有读取权限。

我知道检查NULL指针:

FILE *f = fopen(fname, "r");
if (f == NULL) {
    // 
}

但我也知道access()

if (access(fname, F_OK|R_OK) != 0) {
    //
}

我试图删除文件的权限检查,只使用NULL 指针的检查。它适用于每种情况。

使用access()F_OK|R_OK 和检查NULL 指针有什么区别?

如果我们不给检查NULL指针带来优势,因为检查内存限制。

【问题讨论】:

  • "我想打开一个文件" 但是access没有打开文件,所以你不能和fopen比较。跨度>
  • @Fredrik 您如何在“open a文件”,然后。
  • @Fredrik On POSIX errnofopen 返回NULL 时被设置。在其他情况下,我不知道在使用fopen 时是否可以以可移植的方式使用。在fopen 之后检查access 不是故障安全的,因为文件(或权限)总是有可能在两次调用之间发生更改。无论如何,如果这就是问题的实际问题,那么应该更清楚地重申它。
  • 我可以使用access 进行检查(读取权限;文件存在),但也可以使用f == NULL。问题是,它们之间是否有任何区别。
  • 你可以用access检查权限,你可以用fopen读取文件(开始)。但是拥有文件的读取权限并不能保证读取它会成功。这些是完全不同的操作,你不能用一个代替另一个。

标签: c file-io file-permissions fopen file-access


【解决方案1】:

使用带 F_OK|R_OK 的 access() 和检查 NULL 指针有什么区别?

两者没有可比性。即使您首先使用access() 执行了成功的测试,您仍然需要对fopen() 进行空检查,如果失败,您仍然不确定为什么不检查errno。另一方面,如果您首先使用access() 执行un成功的测试,这并不能肯定地告诉您后续的fopen() 将失败。 access() 的失败和fopen() 的失败告诉你不同的事情。

这里的部分问题是计算系统是动态的。例如,仅仅因为我现在不存在或无法访问文件并不意味着它不会在现在和现在之间的某个时间点被创建或访问 + t,即使对于非常小的 t。如果您打算在可能的情况下打开文件,那么最好的方法是直接尝试打开它。检查是否成功很重要,但以编程方式评估任何失败的原因通常并不重要。 perror()sys_errlist 提供了生成适当用户反馈的方法。

【讨论】:

    【解决方案2】:

    当您需要在打开文件之前可靠地检查对文件的访问权限时,您将面临著名的TOCTOU 问题。因此,任何包含使用某种“原子”操作的解决方案都是可取的。因此,调用 (f)open() 然后检查错误是否比调用 access() 后跟 (f)open() 打电话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2010-12-16
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多