在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跟踪停止并且不再创建文件?
答案 0 :(得分:1)
一旦打开,文件描述符将保留与您在函数调用时传递给open(2)
的名称指定的文件的关联。如果您以后从磁盘中删除该文件,则从该名称中取消该文件,但该文件将一直存在,直到对它的所有引用都消失为止。
删除文件后,您的程序是参考文件的唯一剩余持有者。程序将继续写入文件,但您不能再命名该文件。出于安全原因,为什么内核实际上不会想要你能够为这些拖欠文件重新获取名称,并且如果不修改操作系统就无法取回它们(有一个Linux内核模块,使这种僵尸复活,但我怀疑Windows有可比性)。程序结束后,文件最终会被删除。