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