Végtelen ciklusú Perl script IO

Egy végtelen ciklusban futtatott perl-scipttel szeretnék külső eszköz állapotáról logot csinálni.
A gondom csak annyi, hogy eddigi tapasztalataim szerint a véges idő alatt lefutó scritpeknél is a változások futási idő alatt nem íródnak ki a fizikai tárra (a std outputon is csak a script lefutása után jelenik meg az összes kiírt adat), egy végtelen ciklusban futó script esetén ez alapvető probléma.
Jelenleg, ha végtelen ciklusban futtatom a programot, semmi nem jelenik meg a képernyőn, sem a fájlban, amibe az adatokat kiírnám, ha ctrl+c-vel megállítom, akkor az adatok elvesznek, az uzenetek sem érkeznek meg a std outputra.
Ez így kell, hogy legyen, vagy valamely módon kikényszeríthetem a fizikai adatmozgatást menet közben?
Kösz: Bálint

Hozzászólások

Potenciális kulcsszó kereséshez: flush vagy sync

Tegyél légy szives a script elejére egy ilyet:

$| = 1;

Meg kellene, hogy oldja!
Gabi

A korrekt választ hadd egészítsem ki annyival, amit a
perldoc -q flush
eredményéből kiollóztam:


The $| is one of the per-filehandle special variables, so each filehandle has its own copy of its value. If you want to merge standard output and standard error for instance, you have to unbuffer each (although STDERR might be unbuffered by default):


{
my $previous_default = select(STDOUT); # save previous default
$|++; # autoflush STDOUT
select(STDERR);
$|++; # autoflush STDERR, to be sure
select($previous_default); # restore previous default
}

... későbbi érthetetlen jelenségeket megelőzendő.

Hello! print helyett használd a syswrite() függvényt, ami megkerüli a Perl IO buffereit és kapásból a write(2) rendszerhívás segítségével firkálja össze a fájlleíródat.