The Linux Programming Interface

(nextflipdebug5) #1

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);
Free download pdf