c - 在多线程应用程序中将日志写入文件

标签 c multithreading logging

我编写了一个服务器客户端应用程序。现在,我必须将服务器上发生的情况写入日志文件。服务器是用 C 编写的。我已经可以使用 printf 编写屏幕上发生的情况。

所以我只需要使用 fprintf 而不是 printf 。我的问题是我应该如何处理该文件?

我有 Server.c 源文件,其中有 main 函数

这是我的服务器应用程序的基本结构:

服务器.c

//.. some code 
int main(...) {
//some code
//initialize variables
//bind server
//listen server on port
  while(1) 
  {
  //accept client

  int check = pthread_create(&thread, NULL, handle_client,&ctx);//create new thread

  //..
  }//end while
return EXIT_SUCCESS;
}//end main

handle_client 是一个在新线程中处理客户端的函数。

我应该如何让服务器记录日志?我将有一个文本文件,例如 SERVERLOG.log,但服务器上有许多客户端。我应该如何处理对此文件的多次访问?

一种方法是在启动服务器时创建文件,打开它,写入文件,然后关闭它。 如果客户端想要写入文件,则应该打开文件进行写入,然后关闭它。

但是当更多的客户端想要写入这个文件时仍然存在问题......

最佳答案

一个常见的解决方案是使用类似 printf 的函数,该函数首先将所有输出写入缓冲区,然后锁定信号量,实际写入文件,并解锁信号量。如果您担心实际写入速度很慢,您可以使用一个队列来插入所有日志消息,并让另一个线程从队列中获取项目并将它们写入文件,您仍然需要使用例如保护队列。信号量,但它应该比执行 I/O 更快。

至于实际文件,要么在主线程中打开它,要么保持打开状态。或者,如果您有一个带队列的特殊日志记录线程,则让该线程进行打开操作。不管怎样,你不需要每次想写东西的时候都打开/关闭它,重要的是要防止它被多个线程同时写入。

关于c - 在多线程应用程序中将日志写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9600130/

相关文章:

c++ - 静态变量初始化的线程安全

java - 如何让 Callable 等待执行?

java - 我应该使用 slf4j 作为 logback 的包装器吗?

c++ - Mac + xcode 6.4 - header 包含路径

c - 在数组中预读以预测 C 中的后续结果

c - C 语言智能编辑器程序

java - 如何停止在 View 上发布处理程序 - android

c - 如何从c中的标准输入读取长度未知的字符流

python - 在 WARNING 级别记录到文件并在 INFO 级别打印到标准输出

java - Logback:如何将日志目录从 "tomcat/bin"更改为与应用程序相关?