You probably are looking for a Tk::fileevent example. Here is a basic one. The Tk script should be started with the name of the file to log. In this example I use a file called z.log. Below the main Tk script is a pumper script which will write to z.log every .1 seconds, to take the place of your c script.
Tk::fileevent works like you want, because everytime the file is written to by your c program, the fileevent fires and inserts it into the display.
#!/usr/bin/perl
# tktail pathname
use warnings;
use strict;
use Tk;
#usage tktail z.log
my $pid = open(H, "tail -f -n 25 $ARGV[0]|") or die ;
my $mw = MainWindow->new;
$mw->fontCreate('big',
-family=>'courier',
-weight=>'bold',
-size=>int(-24*24/14));
my $t = $mw->Text(-width => 80, -height => 25,
-wrap => 'none',
-bg => 'lightyellow',
-font => 'big')->pack(-expand => 1);
$mw->fileevent('H', 'readable', [\&fill_text_widget, $t]);
$mw->OnDestroy(\&quitCB);
MainLoop;
sub fill_text_widget {
my($widget) = @_;
my $text = <H>;
$widget->insert('end', $text);
$widget->yview('end');
} # end fill_text_widget
sub quitCB {
kill 9,$pid or die $!;
exit;
}
and the test pumper script
#!/usr/bin/perl
use warnings;
use strict;
# pumps the file for testing
$| = 1;
open (ZH, "> z.log") or die "$_\n";
# autoflush ZH
my $ofh = select(ZH);
$| = 1;
select($ofh);
while(1){
print ZH time."\n";
print '#'; #action indicator
select(undef,undef,undef,.1);
}