2

子供をフォークするPOEPerlプログラムがあります。

それがフォークしている子供たちは、リモートデバイスへのロギングとインタラクティブなtelnetを行います。POEはSTDOUTを使用して出力を親プロセスに戻しますが、何らかの理由で失われます(画面やファイルに移動しません)。

これは、STDOUTがどこかにリダイレクトされているためだと私は理論付けています-どこにあるかを確認する必要があります。

子のSTDOUTがTTYではないことを識別するために(-t STDOUT)を使用しました。

また、子が呼び出される前に、子のSTDOUTを親のSTDOUTにリセットしましたが、このメソッドはPOEのイベントハンドラーを回避しているようで、出力を親のSTDOUTにダンプするだけです。

Q)データがどこに向かっているのかを見つけるために、現在のSTDOUTが何を指しているのかを特定するにはどうすればよいですか?

ありがとう

サイモン

4

4 に答える 4

1

filenoこの状況で役立ちますか?子が閉じて再度開いている場合、子STDOUTfileno(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

フォークされた子もPerlプログラムの場合は、「STDOUTを選択」して$|を設定できます。ロギングが発生する直前にバッファリングされていないことをマークします。

于 2009-11-07T02:04:24.860 に答える
1

これは、POE :: Filter :: Reference StdOutハンドラーが、期待していた形式ではない子プロセスによって出力されて送信されたことが原因でした。

フィルタを削除しました-送信内容を確認できたため、問題を修正できました。

問題は、子プロセスがそのサブプロセスSTDOUTの内容をStdOutハンドラーへのソケット接続に沿って吐き戻していたことでした。

サイモン

于 2009-11-11T15:22:51.010 に答える
0

これがバッファリングの問題ではないことを確認しますか?私はPOEに精通していないので、どのように調査または修正するかはわかりませんが、少なくとも確認する価値があると思います。

于 2009-11-06T20:56:01.413 に答える