/* gcc -o hog hog.c */ #define _GNU_SOURCE #ifdef __sun__ #include #else #include #endif #include #include #include #include #include #ifdef __sun__ #define _POSIX_PTHREAD_SEMANTICS 1 #endif #include #include #define HIST 10 static sig_atomic_t stop; static void sighandler (int signr) { (void) signr; stop = 1; } static unsigned long hog (unsigned long niters) { stop = 0; while (!stop && --niters) ; return niters; } int main (void) { unsigned int i; struct itimerval it; sigset_t set; unsigned long v[HIST]; double tmp = 0.0; unsigned long n; it.it_interval.tv_sec = 0; it.it_interval.tv_usec = 1; it.it_value.tv_sec = 0; it.it_value.tv_usec = 1; if (signal (SIGALRM, &sighandler)) { #ifdef __sun__ fprintf(stderr, "failed to set signal handler"); exit(1); #else err (EXIT_FAILURE, "failed to set signal handler"); #endif } if (setitimer (ITIMER_REAL, &it, NULL)) { #ifdef __sun__ fprintf(stderr,"failed to set interval timer"); exit(1); #else err (EXIT_FAILURE, "failed to set interval timer"); #endif } for (i = 0; i < HIST; ++i) { v[i] = ULONG_MAX - hog (ULONG_MAX); } for (i = 0; i < HIST; ++i) { printf ("%d = %ld\n", i, v[i]); tmp += v[i]; } tmp /= HIST; n = tmp - (tmp / 3); if (sigemptyset (&set)) { #ifdef __sun__ fprintf( stderr, "failed to empty sigset"); exit(1); #else err (EXIT_FAILURE, "failed to empty sigset"); #endif } if (sigaddset (&set, SIGALRM)) { #ifdef __sun__ fprintf(stderr, "failed to add to sigset"); exit(1); #else err (EXIT_FAILURE, "failed to add to sigset"); #endif } for (;;) { int signr; hog (n); if (sigwait (&set, &signr)) { #ifdef __sun__ fprintf(stderr, "failed to wait for a signal"); exit(1); #else err (EXIT_FAILURE, "failed to wait for a signal"); #endif } } return 0; }