在日志文件删除时,STDERR重定向到日志文件中断

时间:2012-08-27 15:52:14

标签: c redirect stderr

在C中开发的服务器代码在unix环境中运行,服务器将STDOUT / STDERR重定向到日志,如下所示

static gboolean
create_log_file (const char *log_file)
{
  int log_file_fd;

  g_return_val_if_fail (log_file != NULL, FALSE);

  log_file_fd = open (log_file, O_WRONLY|O_CREAT|O_TRUNC, 0644);

  if (log_file_fd < 0)
    {
      return FALSE;
    }

  dup2 (log_file_fd, 1);
  dup2 (log_file_fd, 2);

  close (log_file_fd);

  return TRUE;
}

计划为此日志文件设置存档/清除cron,以确保磁盘使用率在限制范围内。

日志记录完全正常,直到清除cron启动并删除日志文件。

观察cron运行删除后日志文件,STDERR跟踪停止并且不再创建文件?

1 个答案:

答案 0 :(得分:1)

一旦打开,文件描述符将保留与您在函数调用时传递给open(2)的名称指定的文件的关联。如果您以后从磁盘中删除该文件,则从该名称中取消该文件,但该文件将一直存在,直到对它的所有引用都消失为止。

删除文件后,您的程序是参考文件的唯一剩余持有者。程序将继续写入文件,但您不能再命名该文件。出于安全原因,为什么内核实际上不会想要你能够为这些拖欠文件重新获取名称,并且如果不修改操作系统就无法取回它们(有一个Linux内核模块,使这种僵尸复活,但我怀疑Windows有可比性)。程序结束后,文件最终会被删除。