Я хотел открыть канал к программе и прочитать ее вывод. Первоначально я склонялся к использованию popen (), но программа принимает ряд опций, и вместо того, чтобы бороться с кавычками / экранированием оболочки, я решил использовать комбинацию pipe (), fork (), dup (), чтобы связать концы канала на stdin / stdout в родительском / дочернем и execv () для замены дочернего элемента вызовом программы, передающей все параметры, которые она ожидает в виде массива.
Программа выводит много строк данных (и сбрасывает стандартный вывод после каждой строки). Родительский код устанавливает для stdin неблокирующий режим и читает из него в цикле с помощью fgets (). Цикл выполняется, пока fgets () не возвращает NULL, или stdin имеет условие ошибки EAGAIN или EWOULDBLOCK.
Он успешно принимает большинство строк, но ближе к концу кажется, что он пропадает, а последняя функция fgets () завершается с ошибкой «Нет такого файла или каталога».
Кто-нибудь знает, что я здесь сделал не так?