Потоковый вывод в stdout, обновление состояния на месте для stderr - PullRequest
0 голосов
/ 11 мая 2018

У меня есть программа, которая должна выводить на stdout, а информация о состоянии переходного процесса на stderr.Программы с похожими результатами могут включать в себя rsync или apt (хотя их вывод достаточно сложный, что сводит его к тому, что мне нужно, просто устрашает).

Эта программа кажется такой, как она должна работать, как описано,но не:

#include <stdio.h>
#include <limits.h>

void *work () {
  for (long i = 0; i < LONG_MAX; i++) {
    if (i % 100000000 == 0) {
      fprintf(stdout, "%ld\n", i);
    }
    fprintf(stderr, "\rrunning %ld", i);
  }

  return 0;
}

int main() {
  work(0);
  fprintf(stderr, "\ndone\n");
  return 0;
}

Информация о состоянии обновляется на месте с помощью stderr по желанию, но через stdout отображается только одна строка вывода.Если статус stderr fprintf будет удален, тогда все выходные данные stdout будут отображаться, как и ожидалось.

Что здесь происходит?

1 Ответ

0 голосов
/ 11 мая 2018

Этот код правильный (ну, void * return from work () - это плохая форма - void был бы намного лучше).

Я подозреваю, что проблема просто в том, что вы не ждете достаточно долго- это занимает время для итерации 100 000 000 итераций, особенно с выводом каждый раз через цикл (помните - вы будете блокировать вывод после заполнения буфера stdout).

Я полагаю, что это займет минимум3 минуты, прежде чем вы получите второй вывод на стандартный вывод.

...