Re: Glib::IO->add_watch and log files
- From: muppet <scott asofyet org>
- To: Daniel Kasak <dkasak nusconsulting com au>
- Cc: gtk-perl-list gnome org
- Subject: Re: Glib::IO->add_watch and log files
- Date: Sun, 8 Apr 2007 19:58:19 -0400
On Mar 19, 2007, at 10:50 PM, Daniel Kasak wrote:
open LOGFILE, "<", "$self->{globals}->{appdir}/app.log";
$| = 1;
Glib::IO->add_watch ( fileno(LOGFILE), ['in', 'hup'], sub {
my ($fileno, $condition) = @_;
if ($condition eq 'hup') {
You should check for $condition >= 'hup', not simply eq 'hup', and
should always do this check *after* reading any available input.
Reason: you can get 'hup' and 'in' on the same callback, and if you
do the hup check first in that situation, you'll silently drop the
last chunk of input.
warn "done\n";
close LOGFILE;
return 0; # uninstall
}
my $line;
sysread LOGFILE, $line, 1024;
A very quick experiment with your code shows that sysread is simply
returning 0 here for all reads after reaching the end of the file.
It appears that you simply don't get a 'hup' at the end of input when
reading a local disk file.
I think that you want to add this line here:
my $nread = sysread LOGFILE, $line, 1024;
return 0 unless $nread; # quit if we've reached the end of
the file
$buffer->insert($buffer->get_end_iter, $line);
return 1;
});
Now, if what you're wanting to do is show new input when it arrives,
a la "tail" in follow mode... well, from a quick glance at the
source to GNU tail, that appears to be done by polling the file
system for size changes.
--
If the monkey could type one keystroke every nanosecond, the expected
waiting time until the monkey types out Hamlet is so long that the
estimated age of the universe is insignificant by comparison ... this
is not a practical method for writing plays.
-- Gian-Carlo Rota
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]