如何在Perl中找到进程STDOUT的当前值?

时间:2009-11-06 20:41:28

标签: perl stdout poe

我有一个支持孩子的POE Perl程序。

它正在分叉的孩子们将记录和交互式telnet做成远程设备。 POE使用STDOUT将输出返回到父进程,但由于某种原因,它会丢失(不会进入屏幕或任何文件)。

我认为这是因为STDOUT被重定向到某个地方 - 我需要确定在哪里。

我使用(-t STDOUT)来识别孩子的STDOUT不是TTY。

我还在调用子项之前将子项的STDOUT重置为父项的STDOUT - 但是这种方法似乎避免了POE的事件处理程序,它只是将输出转储到父项STDOUT。

问:我如何识别当前STDOUT指向的内容,以便找到我的数据发送位置

由于

西蒙

4 个答案:

答案 0 :(得分:1)

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.)

答案 1 :(得分:1)

如果您的分叉孩子也是Perl程序,您可以“选择STDOUT”并设置$ |在任何日志记录发生之前将其标记为无缓冲。

答案 2 :(得分:1)

这是由子进程发送的POE :: Filter :: Reference StdOut Handler输出的,该进程的格式不符合预期的格式。

删除了过滤器 - 然后可以查看它的发送内容,这使我能够纠正这个问题。

问题是子进程正在沿着与StdOut Handler的套接字连接反射其子进程STDOUT的内容。

西蒙

答案 3 :(得分:0)

您确定这不是缓冲问题吗?我不熟悉POE所以我不知道你是如何调查或纠正的,但我怀疑它至少值得检查。