3

我在一个大型 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 在创建时成功,但在打开时没有?

4

2 回答 2

4

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

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

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

于 2013-03-11T16:56:38.403 回答
4

fopen0666创建具有由进程修改的权限的文件umask

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

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

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

于 2013-03-11T20:33:17.543 回答