cplusplus11.Examples/UNIX/timer/nanosleep_wait.cpp
Source: cplusplus11.Examples/UNIX/timer/nanosleep_wait.cpp
/*
To use this example
compile and run it with
./nano-test seconds nanoseconds
try something like:
./nano-test 30 200
then press Ctrl+C to see how much time is left after the signal.
*/
#include<iostream>
#include<ctime>
#include<signal.h>
#include<sys/time.h>
void recursive_sleep(int seconds, long nanoseconds, struct timespec *t, struct timespec *remain);
void handler(int ) {
}
int main(int argc, char **argv) {
if(argc != 3) {
std::cerr << "Error arguments are:\n" << argv[0] << " seconds nanoseconds\n";
exit(EXIT_FAILURE);
}
int seconds = atoi(argv[1]);
long nanosec = atol(argv[2]);
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = handler;
if(sigaction(SIGINT, &sa, NULL) == -1) {
std::cerr << "Error on setting up signal handler..\n";
exit(EXIT_FAILURE);
}
struct timespec s, remain;
s.tv_sec = seconds;
s.tv_nsec = nanosec;
std::cout << "Sleeping for: " << seconds << " seconds and " << nanosec << " nanoseconds.\n";
recursive_sleep(seconds, nanosec, &s, &remain);
return EXIT_SUCCESS;
}
void recursive_sleep(int seconds, long nanoseconds, struct timespec *t, struct timespec *remain) {
std::cout << "Going to sleep..\n";
if(nanosleep(t, remain) == -1) {
std::cout << " Sleep interupted..\n" << remain->tv_sec << " seconds and " << remain->tv_nsec << " nano seconds remaining..\n";
struct timespec old;
recursive_sleep(seconds, nanoseconds, remain, &old);
return;
} else {
std::cout << "Slept for: " << seconds << " seconds and " << nanoseconds << " nanoseconds\n";
}
}