在一次退出时,如何收集用于调试日志文件的调试消息的最佳方法是什么?
我用的是c语言,我想用排队系统。这是正确的解决办法吗。
我不需要复杂的解决方案。我所需要的只是将调试日志字符串存储起来,然后在程序结束时一次性调用时将其释放以写入文件,任何此类例程的示例
最佳答案
fprintf()
etc已经行缓冲。所以它会自动为你节省一些磁盘时间。如果坚持要进一步缓冲,请使用setvbuf()
来use_IOFBF
,以便对您编写的流进行完全缓冲。
注意,stdout
是行缓冲的,stderr
是无缓冲的。相应地选择setvbuf
的参数!
在对问题的评论中已经注意到很多编辑,只有当流不是ccc>或stdout
时才有缓冲,但当流是调试文件(当程序退出时分析),并且程序有密集的日志记录并长时间运行时,缓冲流绝对是有意义的。
下面是一个示例,演示了块写入的用法。通常,所有文件都是块缓冲的。现在,我将重写此行为,并使用stdin
使其无缓冲,让我们看看时间差有多大
#include<stdio.h>
int main()
{
FILE *fp = fopen ("new.txt","w+");
int i =0;
/* Comment the below line to make fp buffered */
i=setvbuf(fp, (char*) NULL,_IONBF, 0);
if ( i )
{
printf("Error in setvbuf\n");
}
for ( long int i=1000000; i>0; i-- )
{
fprintf(fp,"Hello %ld\n",i );
}
fclose(fp);
return 0;
}
对于缓冲(即注释
setvbuf
行),下面是命令的输出time ./a.out
real 0m0.224s
user 0m0.192s
sys 0m0.020s
无需缓冲(即启用
setvbuf
)time ./a.out
real 0m4.479s
user 0m0.752s
sys 0m3.708s
我们可以看到4.2秒的巨大差异!!
希望这能帮助人们学习缓冲和日志记录。