2

我有一个 POE Perl 程序 forking children。

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

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

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

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

Q) 如何识别当前 STDOUT 指向的位置,以便找到数据的去向

谢谢

西蒙

4

4 回答 4

1

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

于 2009-11-07T02:04:24.860 回答
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.)
于 2009-11-06T22:04:02.003 回答
1

这归结为 POE::Filter::Reference StdOut 处理程序被子进程发送的输出不是它所期望的格式。

删除了过滤器 - 然后可以看到它正在发送什么,这使我能够纠正这个问题。

问题是子进程将其子进程 STDOUT 的内容沿套接字连接返回到 StdOut 处理程序。

西蒙

于 2009-11-11T15:22:51.010 回答
0

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

于 2009-11-06T20:56:01.413 回答