我在一个庞大的Linux守护进程中运行了以下代码片段。
我正在尝试调试日志文件,但是当日志文件存在时,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在创建时会成功,但在打开时不会成功?
答案 0 :(得分:4)
如果文件不存在,“a”选项将始终创建文件,如果成功则返回有效指针。它是根据进程的umask设置创建的 - 在您的情况下,进程正在创建没有适当权限的文件,因此下次fopen
失败。如果您不想弄乱umask,只需在fopen
:
chmod("/home/lala/debug.log", 0644);
如果文件不存在,可以用这种方式调用chmod
,它只会做任何事情(除了适当地设置errno
)。
答案 1 :(得分:4)
fopen
创建的文件的权限0666
已由流程umask
修改。
因此,如果您不在程序中或程序完成后手动更改文件权限。
该过程很可能是错误的umask。
您是在程序中还是在调用进程的上下文中设置umask
?您的umask -S
输出实际上看起来很好(看起来像umask 002
)。