Всегда ли printf очищает буфер при обнаружении новой строки?

Моя машина работает под управлением ubuntu 10.10, и я использую стандартную библиотеку gnu C. У меня создалось впечатление, что printf сбрасывает буфер, если в строке формата описана новая строка, однако следующий код, казалось, неоднократно нарушал эту тенденцию. Может кто-нибудь пояснить, почему буфер не очищается.

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>

int main()
{
    int rc;
    close(1);
    close(2);
    printf("HI 1\n");
    fprintf(stderr, "ERROR\n");

    open("newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600);
    printf("WHAT?\n");
    fprintf(stderr, "I SAID ERROR\n");

    rc = fork();

    if (rc == 0)
    {
        printf("SAY AGAIN?\n");
        fprintf(stderr, "ERROR ERROR\n");
    }
    else
    {
        wait(NULL);
    }

    printf("BYE\n");
    fprintf(stderr, "HI 2\n");

    return 0;
}

Содержимое newfile.txt после запуска этой программы выглядит следующим образом.

HI 1
WHAT?
SAY AGAIN?
BYE
HI 1
WHAT?
BYE
10
задан Varun Madiath 8 March 2011 в 06:23
поделиться