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
- 713 megtekintés
Hozzászólások
Potenciális kulcsszó kereséshez: flush vagy sync
- A hozzászóláshoz be kell jelentkezni
Tegyél légy szives a script elejére egy ilyet:
$| = 1;
Meg kellene, hogy oldja!
Gabi
- A hozzászóláshoz be kell jelentkezni
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ő.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni