【问题标题】:How to check if a file is in read-only mode in C [duplicate]如何在C中检查文件是否处于只读模式[重复]
【发布时间】:2015-05-17 03:57:24
【问题描述】:

如何在 C 语言中检查文件是否处于只读模式?我想在打开文件之前检查是否可以写入文件。

【问题讨论】:

  • 看看stat()函数
  • 我觉得奇怪的是你接受了一个解决方案,尽管它提出了一些明智和正确的建议,但并没有真正回答你的问题,即 在打开它之前

标签: c file unix readonly chmod


【解决方案1】:

您可以使用 fstat() 函数。 有关详细信息,请参见 man 2 fstat: http://linux.die.net/man/2/fstat

【讨论】:

  • 请注意,您只能在打开的文件描述符上使用fstat() 函数。使用文件名的函数是 stat() 或同一页面上列出的其他函数之一 - lstat()fstatat()
【解决方案2】:

您可以使用 fopen,并检查返回值。在这里查看:http://www.tutorialspoint.com/c_standard_library/c_function_fopen.htm

【讨论】:

  • 现在可以使用了!非常感谢!
【解决方案3】:

在这种情况下,尝试打开文件进行写入,并在打开失败时做出适当的反应(“请求宽恕比请求权限更容易”),而不是尝试确定它是否会失败,这是最简单和最可靠的情况第一个(“跳之前先看看”)——见LBYL vs EAFP

您可以使用stat(),但要正确确定权限有点棘手。此外,即使stat() 报告的权限表明您不能(反之亦然),也可能存在 ACL,这意味着您可以访问文件进行写入。你可以使用access(filename, W_OK),它通常会给你正确的答案——除非你的程序运行的有效UID不同于真实的UID。

但是,任何 LBYL 策略也存在 TOCTOU(检查时间、使用时间)问题。在您检查文件权限和您实际尝试打开文件的时间之间,文件或通向它的目录之一的权限可能会发生变化。权限可能会说“没关系”,但文件可能已被删除,或从那时起更改为只读。

【讨论】:

    【解决方案4】:

    虽然使用 fstat/stat 函数检索文件权限会给你很好的提示,但我建议不要太相信它们,因为有些角落的文件是可写的,尽管报告为只读,例如如果您是 root,并且在报告为可写的情况下您将无法写入文件,例如如果它位于只读文件系统上。

    ACL 也可能通过颠倒 st_mode 报告的内容来扮演类似的令人困惑的角色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多