не очень понятно, почему !fgets(...) *И* ferror(...) Потому что
имеет смысл прекращать чтение когда файл закончился *ИЛИ* поток
испорчен. При "&&", если файл доступен для чтения, условие в if()
не выполняется никогда.
Я процессы в твоем коде не увидел, но вот к примеру простенький код,
который читает ввод через pipe, открытый "cat", и выводит строку
наоборот:
char buf[1024];
FILE *is = popen("cat", "r");
int i;
while (fgets(buf, sizeof(buf), is)) {
i = 0;
while (i++ < strlen(buf) - 1)
putchar(buf[strlen(buf) - i - 1]);
putchar('\n');
}
может, что-то прояснится ...
Удачи.
fgets(buf... отрабатывает последний раз (не 0 возвращает),
ты спасаешь его в buf_arr.
В след. раз он (fgets) возвращает 0, и ты зачем-то еще раз его (buf) спасаешь.
Поскольку он (buf) не изменился (man fgets), последняя строчка появляется 2 раза.