0

有一个用 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 跟踪停止并且不再创建文件?

4

1 回答 1

1

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

删除文件后,您的程序是唯一剩余的引用持有者。程序将继续写入文件,但您不能再命名该文件。出于安全原因,内核实际上不希望您能够重新获得此类拖欠文件的名称,并且您无法在不修改操作系统的情况下取回它们(有一个 Linux 内核模块可以实现这种僵尸复活,但我怀疑Windows有类似的东西)。当您的程序结束时,该文件最终被永久删除。

于 2012-08-27T16:12:30.877 回答