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.
This work is licensed under a Creative Commons Attribution 3.0 Unported License.