将日志写入多线程应用程序中的文件

时间:2012-03-07 10:55:50

标签: c multithreading logging

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

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

我有Server.c源文件,其中有主要功能

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

Server.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,但服务器上有许多客户端。我该如何处理对此文件的多次访问?

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

但是当更多客户想要在此文件中写入时仍然存在问题....

3 个答案:

答案 0 :(得分:3)

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

对于实际文件,要么在主线程中打开它,要保持打开状态。或者,如果您有一个带队列的特殊日志记录线程,那么让该线程执行打开。无论如何,每次你想要写东西时都不需要继续打开/关闭它,重要的是保护它不被多个线程同时写入。

答案 1 :(得分:0)

保持开放状态。在服务器启动时打开日志文件。

答案 2 :(得分:0)

避免错误隔行输出缓冲区的一种简单方法是使用单独的日志记录过程,通过管道(或命名管道)连接。记录器刚刚从管道中的read()上被阻塞,并将它获取的任何内容写入文件。 (读者的stdin,stdout实际上可以指向管道和文件)客户端只是写入管道(可以通过stderr写入dup()d)写入管道(最多为PIPE_BUF)保证是原子的。 / p>