Труба не получает весь вывод от дочернего процесса - PullRequest
0 голосов
/ 10 января 2010

Я хотел открыть канал для программы и прочитать вывод из нее. Сначала я хотел использовать popen (), но программа использует несколько параметров, и вместо того, чтобы бороться с цитированием / экранированием оболочки, я решил использовать комбинацию pipe (), fork (), dup () для привязки конец канала к stdin / stdout в parent / child и execv () для замены дочернего элемента при вызове программы, передающей все параметры, которые он ожидает в виде массива.

Программа выводит много строк данных (и сбрасывает стандартный вывод после каждой строки). Родительский код устанавливает stdin для неблокирования и читает из него в цикле, используя fgets (). Цикл выполняется, пока функция fgets () возвращает значение, отличное от NULL, или в stdin имеется условие ошибки EAGAIN или EWOULDBLOCK.

Он получает большинство строк успешно, но к концу он, кажется, падает, при этом последний fgets () завершается ошибкой с нечетной ошибкой «Нет такого файла или каталога».

Кто-нибудь знает, что я мог здесь сделать неправильно?

Ответы [ 3 ]

2 голосов
/ 10 января 2010

Я нашел проблему.Я тупо не сбрасывал errno, чтобы обнулить каждую итерацию.Наверное, я просто предполагал, что fgets () позаботится об этом или о чем-то ... Моя глупая ошибка.Сейчас работает нормально.Всегда сбрасывайте errno!

Спасибо за помощь в любом случае.

0 голосов
/ 10 января 2010

Убедитесь, что вы открыли трубу для STDERR. Большинство программ записывают данные об ошибках вместо STDIN.

0 голосов
/ 10 января 2010

не уверен, что в linux есть классная функция с именем posix_spawn (пример здесь http://www.opengroup.org/onlinepubs/000095399/xrat/xsh_chap03.html#tag_03_03_01_02), иногда это облегчает создание каналов ... но звучит как возможная проблема блокировки или канала ....

...