2 #define _POSIX_PTHREAD_SEMANTICS
15 static volatile sig_atomic_t stop
;
17 static void sighandler (int signr
)
23 static unsigned long hog (unsigned long niters
)
26 while (!stop
&& --niters
)
31 static void err (int status
, const char *fmt
, ...)
34 int errno_code
= errno
;
37 vfprintf (stderr
, fmt
, ap
);
39 fprintf (stderr
, ": %s\n", strerror (errno_code
));
43 int main (int argc
, char **argv
)
49 unsigned long v
[HIST
];
58 divisor
= strtol (argv
[1], &endptr
, 0);
59 if ((endptr
&& *endptr
)
60 || (errno
== ERANGE
&& (divisor
== LONG_MAX
|| divisor
== LONG_MIN
))
61 || (errno
&& divisor
== 0)) {
62 err (EXIT_FAILURE
, "Can't read `%s' as integer", argv
[1]);
69 act
.sa_handler
= sighandler
;
70 if (sigemptyset (&act
.sa_mask
)) {
71 err (EXIT_FAILURE
, "sigemptyset failed");
75 it
.it_interval
.tv_sec
= 0;
76 it
.it_interval
.tv_usec
= 1000000 / divisor
;
77 it
.it_value
.tv_sec
= 0;
78 it
.it_value
.tv_usec
= 1000000 / divisor
;
80 if (sigaction (SIGALRM
, &act
, NULL
)) {
81 err (EXIT_FAILURE
, "sigaction failed");
84 if (setitimer (ITIMER_REAL
, &it
, NULL
)) {
85 err (EXIT_FAILURE
, "setitimer failed");
89 for (i
= 0; i
< HIST
; ++i
) {
90 v
[i
] = ULONG_MAX
- hog (ULONG_MAX
);
93 for (i
= 0; i
< HIST
; ++i
) {
94 printf ("%d = %ld\n", i
, v
[i
]);
100 if (sigemptyset (&set
)) {
101 err (EXIT_FAILURE
, "sigemptyset failed");
104 if (sigaddset (&set
, SIGALRM
)) {
105 err (EXIT_FAILURE
, "sigaddset failed");
112 if (sigwait (&set
, &signr
)) {
113 err (EXIT_FAILURE
, "sigwait failed");