当我注意到一些我不理解的东西时,我正在玩重定向。
我有一个基本的多客户端服务器程序,当用户连接或断开连接时,它会将消息写入标准输出。
如果我在其他终端中运行并关闭2个客户端,输出将是这样的:
Waiting for connections....
A user connected
A user connected
A user disconnected
A user disconnected
如果我通过
将输出重定向到文件./Server >logfile.txt
当我打开日志文件时,我看到类似这样的内容:
Waiting for connections....
A user connected
A user disconnected
Waiting for connections....
A user connected
A user disconnected
我的问题是:如何获得相同的输出?
答案 0 :(得分:2)
我怀疑你的服务器程序的代码是这样的:
printf("Waiting for connections...\n");
while ((handle = new_connection()) != 0)
{
if ((pid = fork()) < 0)
fprintf(stderr, "...");
else if (pid == 0)
{
printf("A user connected\n");
manage_connection(handle);
printf("A user disconnected\n");
exit(0);
}
}
当输出到达终端时,输出是行缓冲的,因此会立即显示Waiting
消息。
当输出转到文件时,输出完全缓冲;在缓冲区填充或发生显式fflush()
或fclose()
之前,数据不会发送到文件,或者进程正常退出。这意味着子进程在其缓冲区中有Waiting
消息,并且将为每个子进程打印该消息的副本。
修复它的唯一方法是修改服务器程序。您可以在打印等待&#39;后使用fflush()
。消息(以及循环之前),或者您可以明确地将输出缓冲设置为_IOLBF
。