# $data is my filehandle to read from my ($rin,$rout,$win,$wout,$ein,$eout); # for select $rin=$rout=$win=$wout=$ein=$eout= ''; vec($rin, fileno($data), 1) = 1; $ein = $rin; my $last = time; my $heartbeat_interval = 60; my $timeout = 1; # for select while (! $done) { $rout=$wout=$eout= ''; my ($nfound, $timeleft) = select($rout=$rin, $wout=$win, $eout=$ein, $timeout); if ($nfound and $rout & $rin) { # read from <$data> carefully not to block # count statistics } my $now = time; if (($now - $last) >= $heartbeat_interval) { $last = $now; # do something every heartbeat_interval seconds } }