Как использовать команду pv для исполняемого файла?

Я знаю, что могу использовать команду pv для отображения прогресса команды. например:

for i in {1..200}; do sleep 0.1; echo "$i"; done | pv -ls 200 > output.txt

Но когда у меня есть файл main.c, который имеет следующий код:

FILE * file; file = fopen("output.txt", "a"); for(int i=0; i<200; i++){ fprint(file, "%d\n", i+1); } fclose(file);

, и когда я запускаю этот файл, у меня есть a.out запускаемый файл. Итак, теперь я хочу использовать команду pv для отображения прогресса команды ./a.out. Есть ли способ сделать это?

-1
задан 13 July 2017 в 09:24

3 ответа

Как я уже упоминал в своем комментарии, основная проблема заключается в том, что ваш a.out записывает в файл, а не в поток stdin, что означает, что pv не может получать никаких данных. Когда ваша программа выводит данные в поток stdin, тогда она работает:

$ ./a.out | pv -ls 200 > /dev/null                                 
 201  0:00:00 [2.09M/s] [========================>] 100%            

$ cat main.c
#include<stdio.h>

int main(){
    int i=0;
    for(i;i<=200;i++)
        fprintf(stdout,"%d\n",i);
    return 0;
}

Кстати, вам не нужно использовать fprintf() для записи на stdout, простой printf("%d\n",i); может быть достаточным

1
ответ дан 22 May 2018 в 20:35
  • 1
    Я пробовал это, и он работал для этого кода. Но когда я попробовал то же самое для своего исходного кода, который содержит некоторые вычисления, это не сработало. Он просто показывает мне 100% после завершения всего выполнения. Это не показывает мне прогресс, достигнутый ранее. Что я делаю не так?? – agangwal 13 July 2017 в 10:21
  • 2
    Ну, во-первых, программа быстро заканчивается. Чтобы увидеть ход выполнения команды, возможно, потребуется медленнее. Во-вторых, что именно вы пробовали с исходным кодом? Отправьте его по адресу paste.ubuntu.com и укажите ссылку – Sergiy Kolodyazhnyy 13 July 2017 в 10:32
  • 3
    Я использую CUDA, и это мой код paste.ubuntu.com/25080734 – agangwal 13 July 2017 в 11:09
  • 4
    Для завершения 1 итерации цикла for требуется 3 с. Итак, время не проблема – agangwal 13 July 2017 в 11:11

Как я уже упоминал в своем комментарии, основная проблема заключается в том, что ваш a.out записывает в файл, а не в поток stdin, что означает, что pv не может получать никаких данных. Когда ваша программа выводит данные в поток stdin, тогда она работает:

$ ./a.out | pv -ls 200 > /dev/null 201 0:00:00 [2.09M/s] [========================>] 100% $ cat main.c #include<stdio.h> int main(){ int i=0; for(i;i<=200;i++) fprintf(stdout,"%d\n",i); return 0; }

Кстати, вам не нужно использовать fprintf() для записи на stdout, простой printf("%d\n",i); может быть достаточным

1
ответ дан 18 July 2018 в 10:22

Как я уже упоминал в своем комментарии, основная проблема заключается в том, что ваш a.out записывает в файл, а не в поток stdin, что означает, что pv не может получать никаких данных. Когда ваша программа выводит данные в поток stdin, тогда она работает:

$ ./a.out | pv -ls 200 > /dev/null 201 0:00:00 [2.09M/s] [========================>] 100% $ cat main.c #include<stdio.h> int main(){ int i=0; for(i;i<=200;i++) fprintf(stdout,"%d\n",i); return 0; }

Кстати, вам не нужно использовать fprintf() для записи на stdout, простой printf("%d\n",i); может быть достаточным

1
ответ дан 24 July 2018 в 19:33

Другие вопросы по тегам:

Похожие вопросы: