I wrote a quick program that takes one argument, how many A characters to print before standard output per second (a negative argument means speed limit). Hope this helps! :-) (On GNU libc, you will need to link your program with -lrt .)
Edit: revised to print the default dot if the second argument is not specified, in which case the first character is used. (And that means if you want to print the NUL character, just specify an empty string as the second argument .: -))
#include <math.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> int sleeptill(const struct timespec *when) { struct timespec now, diff; clock_gettime(CLOCK_REALTIME, &now); diff.tv_sec = when->tv_sec - now.tv_sec; diff.tv_nsec = when->tv_nsec - now.tv_nsec; while (diff.tv_nsec < 0) { diff.tv_nsec += 1000000000; --diff.tv_sec; } if (diff.tv_sec < 0) return 0; return nanosleep(&diff, 0); } int main(int argc, char **argv) { double rate = 0.0; char *endp; struct timespec start; double offset; if (argc >= 2) { rate = strtod(argv[1], &endp); if (endp == argv[1] || *endp) rate = 0.0; else rate = 1 / rate; if (!argv[2]) argv[2] = "."; } if (!rate) { fprintf(stderr, "usage: %s rate [char]\n", argv[0]); return 1; } clock_gettime(CLOCK_REALTIME, &start); offset = start.tv_nsec / 1000000000.0; while (1) { struct timespec till = start; double frac; double whole; frac = modf(offset += rate, &whole); till.tv_sec += whole; till.tv_nsec = frac * 1000000000.0; sleeptill(&till); write(STDOUT_FILENO, argv[2], 1); } }
Chris jester-young
source share