我编写了一个服务器客户端应用程序。现在,我必须将服务器上发生的情况写入日志文件。服务器是用 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/