文件存在时 fopen 失败

Posted

技术标签:

【中文标题】文件存在时 fopen 失败【英文标题】:fopen fails when file exists 【发布时间】:2013-02-26 22:42:43 【问题描述】:

我在一个大型 Linux 守护程序中运行了以下 sn-p 代码。 我正在尝试调试到日志文件,但是当日志文件存在时,fopen 失败

if ( ( debugFILE = fopen( "/home/lala/debug.log", "a" ) ) == NULL )

    perror("error: ");

我得到的错误是:“权限被拒绝”。

这是特定文件 ls 的输出:

----rw---- 1 lala lala 0 Mar 11 18:26 debug.log

首先,为什么首先使用这些权限创建文件。 二、为什么fopen在创建时成功,而在打开时却没有?

【问题讨论】:

导演的umask -S 是什么? @chrisaycock u=rwx,g=rwx,o=rx 【参考方案1】:

fopen 使用进程的umask 修改的权限0666 创建文件。

因此,如果您没有在程序中或在程序完成后手动更改文件权限。

该进程很可能有一个错误的 umask。

您是在程序中还是在调用进程的上下文中设置umask?您的 umask -S 输出实际上看起来不错(看起来像 umask 002)。

【讨论】:

【参考方案2】:

如果文件不存在,“a”选项将始终创建一个文件,如果成功则返回一个有效指针。它是根据进程的 umask 设置创建的 - 在您的情况下,该进程正在创建一个没有适当权限的文件,因此下次 fopen 失败。如果你不想弄乱umask,就在fopen前后调用这个:

chmod("/home/lala/debug.log", 0644);

如果文件不存在,可以通过这种方式调用chmod,它什么也不做(除了适当地设置errno)。

【讨论】:

以上是关于文件存在时 fopen 失败的主要内容,如果未能解决你的问题,请参考以下文章

fopen打开文件失败原因分析

fopen

fopen函数的问题:函数返回NULL的情况都有哪些???

由 tmpnam 创建的文件名的 fopen 在 mingw 上失败

fopen()函数

fopen参数介绍