Frage

Ich bin mit

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

Durch beziehen STDIN, STDOUT, und STDERR Streams

#!/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.

Ich weiß, dass es nicht die ganze Zeit arbeiten. Zum Beispiel aktualisiere ich die Seite für 10-mal. x-mal wird es „X BEGIN HALLO WELT“ ausdrucken. (10-x) Zeit es einfach nichts ausdrucken.

Ich kann keinen Grund finden, warum es auf diese Weise verhalten. Ich weiß, kann jemand von euch ähnliche Problem wie ich begegnen?

War es hilfreich?

Lösung

Ich muss explizit speichern und wiederherzustellen. Es funktioniert für meinen Fall. Aber ich bin nicht sicher, warum.

# 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: $!";

Andere Tipps

Versuchen:

local $|=1;

vor print. Diese umgehen die Pufferung.

Siehe http://perldoc.perl.org/perlvar .html # Griff-% 3Eautoflush% 28EXPR% 29

Buffering ist die wahrscheinlichste Problem, wie bereits erwähnt, aber es gibt einen anderen Ansatz, wenn das aus irgendeinem Grund nicht für Sie arbeiten. Sie können die oft ignoriert ein argument select () Built-in verwenden, um die Standard-Ausgabe-Dateihandle für die Druckausgabe zu ändern.

Ich wette, es ist eine Interaktion von mod_perl und die Neuzuordnung der STDOUT glob - Sie effektiv eine Instanz von Perl in dem Webserver ausgeführt wird, dann wird dies auf eine Race-Bedingung führen, wenn der local den Gültigkeitsbereich verläßt, und wenn die verschiedenen print des und close des passieren.

Dies ist im Grunde eine Vermutung von mir, ich weiß nicht sicher, dass es, dass so im Auge behalten geschieht. Etwa die Race-Bedingung zu sprechen wäre zwischen, wenn Sie dies tun:

local *STDOUT = $nullfh;

und wenn diese local den Gültigkeitsbereich verlässt. Ich denke, dass Anfragen an den Webserver als unterschiedlicher Threads behandelt (da wir mod_perl verwenden), und jeder Thread kann in der Lage sein, den neuen Wert für den glob zu sehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top