一時的にSTDOUTには/ dev / nullにリダイレクト - すべての時間を動作しません

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

  •  20-08-2019
  •  | 
  •  

質問

私が使用しています。

Server version: Apache/1.3.34 (Debian)
mod_perl - 1.29

STDIN、STDOUTへの参照のうえすることにより、およびSTDERRストリーム

#!/usr/bin/perl5
package main;

use strict 'vars';

{
    # Our mighty holy legacy code love to print out message in the middle of operation. Shihh....
    # Let's quietly redirect those message to /dev/null.
    my $nullfh = Apache::gensym( );
    open $nullfh, '>/dev/null' or warn "Can't open /dev/null: $!";
    local *STDOUT = $nullfh;
    print "BYE BYE WORLD";    # Shouldn't show in webpage.
    close $nullfh;
}

print "X BEGIN HELLO WORLD";  # Should show in webpage.

私はそれがすべての時間を働いていないことを実現しています。例えば、私は10回のページを更新します。 X回それは "Xは、HELLO WORLDをBEGIN" 出力します。それだけで何もプリントアウトしていない(10-x)の時間ます。

私はそれがこのように振る舞うない理由を見つけることができません。私はあなたの誰も私と同様の問題が発生した知っていることはできますか?

役に立ちましたか?

解決

私は明示的に保存し、復元する必要があります。それは私の場合のために働きます。しかし、私はなぜわからない。

# Take copies of the file descriptors
open OLDOUT, '>&STDOUT';
my $returned_values = 0;
{
    # Our mighty holy legacy code love to print out message in the middle of operation. Shihh....
    # Let's quietly redirect those message to /dev/null.
    local *STDOUT;
    open STDOUT, '>/dev/null' or warn "Can't open /dev/null: $!";
    print "BYE BYE WORLD";    # Shouldn't show in webpage.
    close STDOUT;
}
# Restore stdout.
open STDOUT, '>&OLDOUT' or die "Can't restore stdout: $!";
# Avoid leaks by closing the independent copies.
close OLDOUT or die "Can't close OLDOUT: $!";

他のヒント

試します:

local $|=1;

printの前に。これは、バッファリングをバイパスします。

http://perldoc.perl.org/perlvarを参照してください。 .htmlを#ハンドル - %3Eautoflush%28EXPR%29

すでに述べたようにバッファリングは、最も可能性の高い問題であるが、それは何らかの理由であなたのために動作しない場合は、別のアプローチがあります。あなたは、印刷出力のデフォルトの出力ファイルハンドルを変更するにはしばしば、無視一引数(選択)ビルトインを使用することができます。

私はそれがmod_perlの間の相互作用、およびSTDOUTグロブの再割り当てで賭ける - あなたが効果的にWebサーバでのperlの1つのインスタンスを実行している、これはlocalがスコープの外に出るときに競合状態につながる、となります様々なprintさんとcloseのが発生したときます。

これは基本的には私の推測ですが、私はそれはとても起こって心の中でそれを維持していることを確認するために知りません。大雑把に競合状態を話すことはあなたがこれを行うとの間になります:

local *STDOUT = $nullfh;

このlocalがスコープの外に出るとき。私は、Webサーバーへの要求は(私たちはmod_perlのを使用しているので)別のスレッドとして扱われ、各スレッドがグロブの新しい値を参照することがあり得ることだと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top