fopen,fprintf,fclose的单线程? [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fopen,fprintf,fclose的单线程? [关闭]相关的知识,希望对你有一定的参考价值。

我将一些非常临时的调试打印放到各种用户空间程序中,以确定哪些代码在嵌入式Linux设备上运行,我希望这些打印文件写入文件而不会让它打开。为了使调试在各种程序之间更容易移植,最好有一个可以打开文件,写入文件并关闭它而不必在别处定义函数/宏的单行程序。我可以这样做:

{ FILE *f = fopen("filename", "a"); if (f) { fprintf(f, "DEBUG MSG
"); fclose(f); } else printf("File open error!
"); }

这只是删除空格:

{
    FILE *f = fopen("filename", "a");
    if (f) {
        fprintf(f, "DEBUG MSG
");
        fclose(f);
    }
    else
        printf("File open error!
");
}

但这感觉不必要复杂。有没有更简单的方法来做到这一点?同样,我不是在谈论使它成为一个函数,因为我希望它可以在不同的程序之间进行复制/粘贴而不必每次都定义一个函数。它基本上是用户空间的临时printk等价物。

答案

Functions.


额外的字符,我最简短的答案。

另一答案

fprintf(f, "DEBUG MSG ");的潜在问题

我假设"DEBUG MSG "是真正信息的占位符。如果真正的消息包含'%',那么该函数将查找缺少的参数。使用fputs() - 它在CPU上也比fprintf()更轻。

fputs(debug_message, f);

真正的消息可能缺少' ',然后在程序崩溃之前陷入缓冲。完成后最好冲洗。

fputs(debug_message, f);
fflush(f);

迂腐:调试是为了解决问题。消息本身常常是有问题/腐败的。考虑使用保护。 (我不相信过多的长调试消息)。当然fprintf()中的垃圾越多,调试日志记录的性能影响就越大。

if (f) {
  if (debug_message) {
    fprintf(f, "%.99s", debug_message);
    fflush(f);
    fclose(f);
  }
}

@Tom Karzes所述,向stderr发送诊断信息,而不是stdout


总的来说,我会使用包含在条件宏而不是嵌入代码中的函数调用。因人而异。

#ifdef NDEBUG
  #define DEBUG_PUTS(level, s)
#else
  #define DEBUG_PUTS(level, s) debug_puts((level), __FILE__, __LINE__, (s))
#endif
另一答案

正如Mark Plotnick所提到的,Linux系统的解决方法是:

system("echo DEBUG MSG >> filename");

它不漂亮,但它很快,复制/粘贴,并且易于使用,因为它也可以写入/dev/kmsg

system("echo DEBUG MSG >> /dev/kmsg");

这使它的行为像printk。当然,它不是一个安全的解决方案,不能与任何干扰bash回声的字符一起使用,但对于临时静态调试消息,它可以正常工作。

以上是关于fopen,fprintf,fclose的单线程? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

fseek不起作用, 当文件fopen在a模式下

用 C fopen 保存文件

C 语言编程 — 文件操作

C 语言编程 — 文件操作

VC++使用fprintf函数实现写日志文件的功能(附源码)

fopen和fclose函数的返回值是多少?