490 Chapter 23
Listing 23-3: Using nanosleep()
––––––––––––––––––––––––––––––––––––––––––––––––––––––timers/t_nanosleep.c
#define _POSIX_C_SOURCE 199309
#include <sys/time.h>
#include <time.h>
#include <signal.h>
#include "tlpi_hdr.h"
static void
sigintHandler(int sig)
{
return; /* Just interrupt nanosleep() */
}
int
main(int argc, char *argv[])
{
struct timeval start, finish;
struct timespec request, remain;
struct sigaction sa;
int s;
if (argc != 3 || strcmp(argv[1], "--help") == 0)
usageErr("%s secs nanosecs\n", argv[0]);
request.tv_sec = getLong(argv[1], 0, "secs");
request.tv_nsec = getLong(argv[2], 0, "nanosecs");
/* Allow SIGINT handler to interrupt nanosleep() */
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = sigintHandler;
if (sigaction(SIGINT, &sa, NULL) == -1)
errExit("sigaction");
if (gettimeofday(&start, NULL) == -1)
errExit("gettimeofday");
for (;;) {
s = nanosleep(&request, &remain);
if (s == -1 && errno != EINTR)
errExit("nanosleep");
if (gettimeofday(&finish, NULL) == -1)
errExit("gettimeofday");
printf("Slept for: %9.6f secs\n", finish.tv_sec - start.tv_sec +
(finish.tv_usec - start.tv_usec) / 1000000.0);
if (s == 0)
break; /* nanosleep() completed */
printf("Remaining: %2ld.%09ld\n", (long) remain.tv_sec,
remain.tv_nsec);