如何使用Linux上的标准I / O函数在多个进程中编写文件?

时间:2013-04-15 15:22:44

标签: c linux unix

我正在开发一项功能,该功能需要在多个进程中编写单个日志文件(由其路径标识)。以前,每个进程用于调用printf来流式传输登录终端(标准输出)。现在我需要将输出目标更改为文件。所以我尝试使用freopen将stdout重定向到每个进程中的文件。

freopen(file_path, "a", stdout); //

但似乎效果不好。缺少一些日志。 实现这一目标的常见做法是什么?

B.T.W在我们的要求中,应允许用户在文件和标准输出之间切换日志目的地,因此当切换回终端时,第一个参数“file_path”可能是tty。可以拨打freopen(tty, "a", stdout)吗?

3 个答案:

答案 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)更简单的是,您可以拥有系统范围的信号量,以确保一次只能写入一条消息。

4)另一种方法可能是使用开源记录器,例如log4jsyslog-ng

答案 2 :(得分:0)

将输出传输到一个文件句柄,例如,使用fprintf输出。由于文件句柄只是指针,因此只需设置output = stdoutoutput = yourFile即可。然后,每当fprintf(output, "sometext")时,每个{{1}}都会向上移动。您甚至可以根据用户输入动态地重定向输出。