重定向输出

时间:2014-04-21 14:03:52

标签: c linux bash file-io

当我注意到一些我不理解的东西时,我正在玩重定向。

我有一个基本的多客户端服务器程序,当用户连接或断开连接时,它会将消息写入标准输出。

如果我在其他终端中运行并关闭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

我的问题是:如何获得相同的输出?

1 个答案:

答案 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