Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 快速连续写入文件有什么危险?_C_Logging_File Io - Fatal编程技术网

C 快速连续写入文件有什么危险?

C 快速连续写入文件有什么危险?,c,logging,file-io,C,Logging,File Io,我正在为一个用C编写的聊天程序开发一个日志机制,我不确定与写入文件有关的潜在危险 我担心垃圾邮件,以及我需要如何处理每秒可能有数十甚至数百个fopen/fclose呼叫的问题,如果这是一个问题的话。现在我让它填充一个缓冲区,然后在缓冲区满后将缓冲区的内容写入文件,但即使这样也不能减轻严重的垃圾邮件攻击,除非缓冲区过大 我是过度偏执还是这是一个需要注意的问题?默认情况下,stdio.hI/O函数使用缓冲。虽然您可以自由使用自己的缓冲区,但请注意,您可能会使日志记录过程过于复杂 如果您计划每秒多次打

我正在为一个用C编写的聊天程序开发一个日志机制,我不确定与写入文件有关的潜在危险

我担心垃圾邮件,以及我需要如何处理每秒可能有数十甚至数百个
fopen
/
fclose
呼叫的问题,如果这是一个问题的话。现在我让它填充一个缓冲区,然后在缓冲区满后将缓冲区的内容写入文件,但即使这样也不能减轻严重的垃圾邮件攻击,除非缓冲区过大


我是过度偏执还是这是一个需要注意的问题?

默认情况下,
stdio.h
I/O函数使用缓冲。虽然您可以自由使用自己的缓冲区,但请注意,您可能会使日志记录过程过于复杂

如果您计划每秒多次打开和关闭一个文件,只需保持文件描述符打开就更有意义。保持文件打开不会阻止您在程序中写入文件,或从其他程序读取日志文件(例如,在后台运行您的程序)

唯一需要注意的是,对于缓冲日志记录系统,在程序终止之前可能不会刷新缓冲区。与中一样,您的缓冲区(或由stdio维护的缓冲区)可能只被部分填充,但崩溃会导致缓冲区的内容永远不会被写入。这可能会阻止关键信息用于调试崩溃


这意味着您应该知道如何捕获可能出现的任何错误,以及在终止之前捕获输出缓冲区。

首先,您不需要每次打开/fclose,只需保持文件打开即可(如果您担心如果程序崩溃得很好,某些内容无法写入日志文件,那么这将只适用于调试日志,而不适用于用户日志)

也就是说,看看别人都做了什么

通常情况下,执事会将所有内容写入日志文件,而不必担心磁盘空间等问题,而cronjob会压缩/清理旧的日志文件。重要的是,IMO:

  • 如果完成日志的磁盘空间,它不会崩溃(因为在大多数情况下,这可能是愚蠢的,但是YMMV)
  • 如果用户真的需要它,添加一个可选的反垃圾邮件功能:请记住,大多数情况下,用户只需禁用日志:)