【问题标题】:fopen fails when file exists文件存在时 fopen 失败
【发布时间】: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

标签: c linux fopen file-permissions


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-05-17
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      相关资源
      最近更新 更多