在一次退出时,如何收集用于调试日志文件的调试消息的最佳方法是什么?
我用的是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秒的巨大差异!!
希望这能帮助人们学习缓冲和日志记录。

09-10 01:40