Как мне найти текущее значение стандартного вывода процесса в Perl?

StackOverflow https://stackoverflow.com/questions/1690270

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть программа POE Perl, разветвляющая дочерние элементы.

Дочерние элементы, которых он разветвляет, ведут журнал и подключаются к интерактивным сетям telnet'а к удаленным устройствам.POE использует стандартный вывод для возврата выходных данных обратно родительскому процессу, но по какой-то причине они теряются (не переходят на экран или в какие-либо файлы).

Я предполагаю, что это потому, что стандартный вывод куда-то перенаправляется - мне нужно выяснить, куда.

Я использовал (-t СТАНДАРТНЫЙ вывод), чтобы определить, что стандартный вывод дочернего элемента не является TTY.

Я также сбросил стандартный вывод дочернего элемента на стандартный вывод родительского элемента до вызова дочернего элемента - но этот метод, похоже, избегает обработчиков событий POE и просто сбрасывает выходные данные в стандартный вывод родительского элемента.

В) Как мне определить, на что указывает текущий стандартный вывод, чтобы я мог найти, куда направляются мои данные

Спасибо

Саймон

Это было полезно?

Решение 3

Это произошло из-за того, что обработчик POE::Filter::Reference StdOut отправлял выходные данные дочернего процесса, которые были не в том формате, который он ожидал.

Удалил фильтр - тогда можно было увидеть, что именно было отправлено, и это позволило мне исправить проблему.

Проблема заключалась в том, что дочерний процесс выбрасывал содержимое своих подпроцессов STDOUT обратно по соединению сокета с обработчиком StdOut.

Саймон

Другие советы

Бы fileno помочь в этой ситуации?Если ребенок закрывается и снова открывается STDOUT, затем fileno(STDOUT) будет иметь другое значение в дочернем элементе, чем в родительском.

$ perldoc -f fileno
   fileno FILEHANDLE
           Returns the file descriptor for a filehandle, or undefined if
           the filehandle is not open.  This is mainly useful for
           constructing bitmaps for "select" and low-level POSIX tty-
           handling operations.  If FILEHANDLE is an expression, the value
           is taken as an indirect filehandle, generally its name.

           You can use this to find out whether two handles refer to the
           same underlying descriptor:

               if (fileno(THIS) == fileno(THAT)) {
                   print "THIS and THAT are dups\n";
               }

           (Filehandles connected to memory objects via new features of
           "open" may return undefined even though they are open.)

Если ваши разветвленные дочерние элементы тоже являются программами Perl, вы можете "выбрать стандартный вывод" и установить $|, чтобы пометить его небуферизованным непосредственно перед началом любого ведения журнала.

Вы уверены, что это не проблема с буферизацией?Я не знаком с POE, поэтому не знаю, как вы это расследуете или исправите, но подозреваю, что, по крайней мере, стоит проверить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top