C CGI Program: как печатать динамически? - PullRequest
0 голосов
/ 08 июля 2010

Здравствуйте, я новичок в CGI-программировании на C.

Что я хочу сделать, так это, как следует из названия, печатать вещи динамически.Например, рассмотрим код, который печатает несколько цифр:

int main()
{
    long int l=0;

    printf("Content-Type: text/plain;charset=us-ascii\n\n");

    while(1)
    {    
        printf("%li ", l);

        if ((l%30) == 0)
            printf("\n");

        if (l == 5000)
            exit(1);

        ++l;
        usleep(3000);
    }    
}

Проблема в том, что он не печатает, пока все не закончится.Как мне заставить печатать вещи точно так же, как на терминале?

1 Ответ

1 голос
/ 08 июля 2010

Вам необходимо явно очистить ваш выходной поток. Когда вывод вашей программы перенаправляется (например, в файл или на вход другой программы, как в этом случае), он периодически очищается только тогда, когда буфер вывода (обычно 4–64 КБ или около того) заполняется.

Чтобы сбросить стандартный вывод, просто позвоните fflush(3):

if((l%30) == 0) {
    printf("\n");
    fflush(stdout);
}

Обратите внимание, что когда вывод идет на терминал (например, если вы только что запустили свою программу в обычном режиме), то по умолчанию это строковый буфер : каждый раз, когда вы печатаете новую строку, вывод сбрасывается , Это значительно облегчает написание интерактивных программ, но снижает производительность неинтерактивных программ. Чем чаще вы выполняете сброс, тем медленнее работает ваша программа, поэтому вы должны выполнять сброс только при необходимости, например, после записи одного длинного связного набора данных, но перед выполнением длительной интенсивной задачи.

...