No caso em que ping está saindo para um pipeline de shell, o comportamento diferente é explicado pelo buffer. ping chama fflush () depois de relatar cada pacote de eco recebido com sucesso, então essas linhas são enviadas imediatamente para o cat, que as envia sem atraso. ping faz não chamar fflush () depois de escrever as linhas que reportam os pacotes expirados, então stdio armazena essas linhas até que ping chame exit (), que então envia todos para cat, que os envia. / p>
No caso em que o ping está saindo diretamente para o terminal, você vê a saída de sucesso e falha imediatamente porque, por padrão, a linha stdio armazena em buffer toda a saída para fluxos associados a ttys. Assim, cada linha de saída é enviada para o terminal imediatamente, em vez de ser armazenada em buffer pelo stdio.
No espírito do ensinar um homem a pescar , você pode verificar tudo isso sozinho lendo o código-fonte do ping e lendo o sistema operacional X página man do stdio .