#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <signal.h>

void sig_handler(int signo);

int
main(int argc, char *argv[])
{
    struct timespec req = {.tv_sec = 5, .tv_nsec = 500000 };
    struct timespec rem;
    int ret;
    time_t t0;

    signal(SIGINT, sig_handler);
    t0 = time(NULL);

retry:
    ret = nanosleep(&req, &rem);
    if (ret == -1) {
        if (errno == EINTR) {
            req.tv_sec = rem.tv_sec;
            req.tv_nsec = rem.tv_nsec;
            goto retry;
        }
        perror("nanosleep");
    }
    printf("elapsed time=%.3f\n", difftime(time(NULL), t0));
    exit(EXIT_SUCCESS);
}

void
sig_handler(int signo)
{
    printf("SIGINT catched\n");
    return;
}
