c - 日志记录队列

标签 c debugging logging buffer

收集调试消息以在退出时一次性记录到文件的最佳方法是什么。

我正在使用 c 并正在考虑使用队列系统。这是正确的解决方案吗?

我不需要复杂的解决方案。我所需要的只是存储调试日志字符串,然后在程序结束时一次性调用时释放以写入文件,此类例程的任何示例

最佳答案

fprintf()等已经行缓冲。所以它会自动为你节省一些磁盘时间。如果您坚持进一步缓冲,use setvbuf()_IOFBF这样您写入的流将被完全缓冲。

请注意 stdout是行缓冲和 stderr是无缓冲的。选择参数 setvbuf相应地!

编辑 正如许多人在对该问题的评论中指出的那样,仅当流为 stdout 时才对其进行无缓冲才有意义。或 stdin但是当流是一个调试文件(一旦程序退出你就分析它)并且你的程序有密集的日志记录并且运行很长时间那么缓冲流绝对有意义。

这是一个示例,它说明了 block 写入的用法。通常,所有文件都是 block 缓冲的。现在,我将覆盖此行为并使用 setvbuf 使其无缓冲看看时差是多少

#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.2s的巨大差异!!

希望这对尝试了解缓冲和日志记录的人有所帮助。

关于c - 日志记录队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9568346/

相关文章:

java - 调试递归函数

asp.net-mvc - 在 ASP.NET MVC 中覆盖 `HandleErrorAttribute`

php - 在服务器上升级 php 版本后,php 脚本中的 SQL 停止工作

java - Tomcat如何将verbose :gc console output to catalina.重定向出去

logging - VB6-如何在启动应用程序时在VB6中创建日志文件

c++ - 通过引用传递在 C 中有效,但不适用于此代码的 C++

c - 分配给结构成员的值不正确

c++ - cuda中的count3非常慢

c - 内核模式下的线程(和进程)和用户模式下的线程(和进程)有什么区别?

debugging - 如何完全转储/打印变量以在 Flutter 中进行控制台?