use 5.14.0; use warnings; use Time::HiRes qw( ualarm gettimeofday usleep ); my $delay = 100_000; # us my $x = 0; sub foo { my $duration = rand 1200; # Some will be longer than the max duration my ($sec, $msec) = gettimeofday; printf "%4d %12d.%03d %6d\n", $x++, $sec, int ($msec / 1000), $duration; vec (my $v, 13, 1) = 0; select ($v, $v, $v, $duration / 10000.); } # foo my $running = 0; $SIG{ALRM} = sub { ualarm ($delay); unless ($running) { $running = 1; foo (); $running = 0; } }; ualarm (10); usleep (10) while 1;