Dazo: Pipe hält Prozess an

Hallo allerseits,

wer kann mir helfen?

Folgendes, ich lese eine XML Datei über eine pipe ein. Diese schein so groß zu sein
das es den Prozeß anhält. Nehme ich einige Zeichen aus einer XML Datei wieder weg, funktioniert
alles wieder.

Weiß jemand von euch ob es bei der Ubergabe auf der Standartausgabe ein Limit gibt. Was über eine Pipe
gehen darf? Was kann ich jetzt machen???

Beispiel:
---
pipe READPIPE, WRITEPIPE;

print_template(\*WRITEPIPE,"t-d1.xml",%rhash);
#--------------sub print_template liegt in einem Perl Script
sub print_template($$$){
my ($outh,$fname,$repref)=@_;

open FH, "$fname" or die "Datei $fname nicht gefunden";  
  
while (my $line = <FH>) {  

#ersetzen, falls vorhanden
  if ($line =~ s/#(\w+)#/exists($repref->{$1})?$repref->{$1}:'UNDEFINED'/eg){
   print $outh $line if exists($repref->{$1});
  }else{    
   print $outh $line;
  }
}
close(FH);
return 1;
}

---

gruß Daniel

  1. Hallo allerseits,

    hey daniel

    wer kann mir helfen?

    ;)

    Folgendes, ich lese eine XML Datei über eine pipe ein. Diese schein so groß zu sein
    Weiß jemand von euch ob es bei der Ubergabe auf der Standartausgabe ein Limit gibt. Was über eine Pipe

    weiss ich leider auch nicht.
    was dir aber vielleicht helfen könnte, ist, den in- / output nicht zu puffern.
    zu diesem zweck setzt du die variable "$" auf >0

    vielleicht hilft das.

    cu
    Felix

    1. was dir aber vielleicht helfen könnte, ist, den in- / output nicht zu puffern.
      zu diesem zweck setzt du die variable "$" auf >0

      Kann man den Puffer auch von der Größe her beeinflussen?
      Weißt du das?

      gruß Daniel

      1. Kann man den Puffer auch von der Größe her beeinflussen?
        Weißt du das?

        sorry, leider nicht.
        es sollte aber irgendwie möglich sein, den puffer zu "flushen".

        anderer ansatz: es gibt die function "sysread", mit der du näher an der hardware
        einlesen kannst. um bspw. genau ein zeichen vom keyboard zu lesen, versuch es so:

        sysread(STDIN, $key, 1);

        sieh dir mal das modul "POSIX" an, speziell
        POSIX::Termios

        gruss
        felix

        1. anderer ansatz: es gibt die function "sysread", mit der du näher an der hardware
          einlesen kannst. um bspw. genau ein zeichen vom keyboard zu lesen, versuch es so:

          sysread(STDIN, $key, 1);

          sieh dir mal das modul "POSIX" an, speziell
          POSIX::Termios

          gruss
          felix

          Hi Felix,

          das war ein sehr guter Tip. Eines weiß ich jetzt aber! Das ich keine
          Übergroßen Streams über eine PIPE laufen lasse.....

          gruß Daniel