【发布时间】:2015-05-17 03:57:24
【问题描述】:
如何在 C 语言中检查文件是否处于只读模式?我想在打开文件之前检查是否可以写入文件。
【问题讨论】:
-
看看
stat()函数 -
我觉得奇怪的是你接受了一个解决方案,尽管它提出了一些明智和正确的建议,但并没有真正回答你的问题,即 在打开它之前。
标签: c file unix readonly chmod
如何在 C 语言中检查文件是否处于只读模式?我想在打开文件之前检查是否可以写入文件。
【问题讨论】:
stat()函数
标签: c file unix readonly chmod
您可以使用 fstat() 函数。 有关详细信息,请参见 man 2 fstat: http://linux.die.net/man/2/fstat
您可以使用 fopen,并检查返回值。在这里查看:http://www.tutorialspoint.com/c_standard_library/c_function_fopen.htm
【讨论】:
在这种情况下,尝试打开文件进行写入,并在打开失败时做出适当的反应(“请求宽恕比请求权限更容易”),而不是尝试确定它是否会失败,这是最简单和最可靠的情况第一个(“跳之前先看看”)——见LBYL vs EAFP。
您可以使用stat(),但要正确确定权限有点棘手。此外,即使stat() 报告的权限表明您不能(反之亦然),也可能存在 ACL,这意味着您可以访问文件进行写入。你可以使用access(filename, W_OK),它通常会给你正确的答案——除非你的程序运行的有效UID不同于真实的UID。
但是,任何 LBYL 策略也存在 TOCTOU(检查时间、使用时间)问题。在您检查文件权限和您实际尝试打开文件的时间之间,文件或通向它的目录之一的权限可能会发生变化。权限可能会说“没关系”,但文件可能已被删除,或从那时起更改为只读。
【讨论】:
虽然使用 fstat/stat 函数检索文件权限会给你很好的提示,但我建议不要太相信它们,因为有些角落的文件是可写的,尽管报告为只读,例如如果您是 root,并且在报告为可写的情况下您将无法写入文件,例如如果它位于只读文件系统上。
ACL 也可能通过颠倒 st_mode 报告的内容来扮演类似的令人困惑的角色。
【讨论】: