Greetings Monks,
I need to tail either a real file, or stdin. I do not want to use Tail::File because it is not a Core module (besides I want to know how this is done anyway).
Here is my read loop ($fh might be either \*STDIN or IO::Handle of an opened file):
while (1) {
my $res = sysread ($fh, my $data, $cfg->{max_line_length});
if (not defined $res) {
die "Input reading failed: $!\n";
}
elsif ($res == 0) {
sysseek ($fh, 0, SEEK_CUR);
sleep (0.5);
next;
}
<do stuff with $data here>
}
Am I correct at assuming that:
- If $fh is a pipe (stdin), then sysread will block and I will never try to seek on stdin, of which it is not capable
- If $fh is a file, the sysread will never block and at EOF the result will always be 0
- If $fh is a file, and the file gets renamed, the descriptor will not be affected and I will continue attempts to read from the same file
- If $fh is a file and it gets unlinked my open descriptor will maintain a reference to it, and I will not get an error - the file will simply stop growing, because no one will write to a non-existing file
Let me know if any of the above is fundamentally wrong.