needperlhelp has asked for the wisdom of the Perl Monks concerning the following question:

My requirement is to read a log file continuously like tail -f <file>,
The cpan module: File::Tail does just this.

But my questions is this :

Both the cpan module & tail command uses time based testing of the file handles.
i don’t understand why select command can't be used in this situation.

Suggestions welcomed

Ps : I probed the tail –f <file> using the truss command.

Replies are listed 'Best First'.
Re: Using Select on file handles
by ikegami (Patriarch) on Dec 05, 2006 at 06:00 UTC

    select returns instantly on EOF. You can't use select to wait for data to appear in the file (as opposed to pipes and sockets). Some sort of delay is required.

    Furthermore, select only works on sockets (as opposed to files and pipes) in Windows.

    Update: (On FreeBSD) Instantly = After 20 nanoseconds.

    use strict; use warnings; use IO::Select qw( ); use Time::HiRes qw( time ); { open(my $fh, '>', 'log') or die; } { open(my $fh, '<', 'log') or die; my $sel = IO::Select->new($fh); my @times; push(@times, time); for (1..5) { push(@times, time); my @r = $sel->can_read(); push(@times, time); read($fh, my $buf='', 1000); } local $, = "\n"; local $\ = "\n"; print @times; } unlink 'log';
    1165299099.32160 1165299099.32163 1165299099.32166 1165299099.32168 1165299099.32169 1165299099.32171 1165299099.32171 1165299099.32173 1165299099.32173 1165299099.32175