我正在开发一项功能,该功能需要在多个进程中编写单个日志文件(由其路径标识)。以前,每个进程用于调用printf
来流式传输登录终端(标准输出)。现在我需要将输出目标更改为文件。所以我尝试使用freopen
将stdout重定向到每个进程中的文件。
freopen(file_path, "a", stdout); //
但似乎效果不好。缺少一些日志。 实现这一目标的常见做法是什么?
B.T.W在我们的要求中,应允许用户在文件和标准输出之间切换日志目的地,因此当切换回终端时,第一个参数“file_path”可能是tty。可以拨打freopen(tty, "a", stdout)
吗?
答案 0 :(得分:1)
以O_APPEND模式写入将执行您想要的as long as they are less than PIPE_BUF bytes,这通常是充足的空间(约4k)。
因此,将新的freopen()ed文件设置为行缓冲(下面为_IOLBF),然后确保您的写入包含刷新缓冲区的换行符:
freopen(file_path, "a", stdout);
setvbuf(stdout, (char *)NULL, _IOLBF, 0); // a.k.a. setlinebuf(stdout) under BSD
...
printf("Some log line\n"); // Note the newline!
答案 1 :(得分:0)
您有很多选择:
1)最简单的方法是每个进程只需单独写入同一个日志。当然,问题是如果任何两个进程同时写入不同的消息,文件将被加扰。
2)您可以让进程向一个“主记录器”发送消息,然后按照接收的顺序一次一个地输出消息。 “主记录器”可能使用套接字。如果所有进程都在同一主机上,则可以改为使用消息队列或命名管道。
3)更简单的是,您可以拥有系统范围的信号量,以确保一次只能写入一条消息。
答案 2 :(得分:0)
将输出传输到一个文件句柄,例如,使用fprintf
输出。由于文件句柄只是指针,因此只需设置output = stdout
或output = yourFile
即可。然后,每当fprintf(output, "sometext")
时,每个{{1}}都会向上移动。您甚至可以根据用户输入动态地重定向输出。