Труба не получает весь вывод от дочернего процесса

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

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

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

Кто-нибудь знает, что я здесь сделал не так?


person ray    schedule 10.01.2010    source источник
comment
Я думаю, вам придется опубликовать код для этого.   -  person Michael Kohne    schedule 10.01.2010


Ответы (3)


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

Все равно, спасибо за помощь.

person ray    schedule 10.01.2010

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

person jspcal    schedule 10.01.2010

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

person Nathan Osman    schedule 10.01.2010