Paul - The Programmer

simple & stupid

how to use the non-buffered stdout of Perl

At first, it's really a interesting bug.  I can't help writing it down.

I write a perl script which should be running quietly and infinitely on the background. I don't like to do writing the run-time log into a file directly in the script. So, I decide to just redirect the stdout to a file when I execute the script.

Now, here comes the werid bug. I start up the script. It works well. Everything is well except there is no log in the redirected stdout file. But after I disable the infinite loop, let it just run one time and exit.  Suprisedly,  the run-time logs appear in the redirected stdout file.

Fortunately, I realize that the problem of perl's output functionality at last.  With default behavior, Perl saves the output strings in a buffer instead of do phsical write to screen everytime. If I kill the script when it's running, then Perl doesn't have the opportunity to write the buffered strings to the screen. The solution is simply adding the code '$| = 1;'  to the begining of the script . It tells Perl using non-buffered I/O to the screen.

Furthermore,  in the case of using the non-buffered I/O to other device.  We can refer to the example below.

$oldh= select(DEV);

$| =1;

select($oldh);

Nice weekend.