文件存在时 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 失败的主要内容,如果未能解决你的问题,请参考以下文章