问题
I want to use clock_nanosleep for waiting of 1 microsec.. As far as I understand, I have to give an absolute time as input. Is the following code okay in this case?
deadline.tv_sec = 0;
deadline.tv_nsec = 1000;
clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &deadline, NULL);
回答1:
As far as I understand, I have to give an absolute time as input.
No, the flags
argument allows you to choose relative or absolute time. You want
clock_nanosleep(CLOCK_REALTIME, 0, &deadline, NULL);
to specify one microsecond from now.
回答2:
Your deadline tv is not an absolute time. To form an absolute time, get the current time with clock_gettime()
(http://linux.die.net/man/3/clock_gettime), then add your sleep interval.
struct timespec deadline;
clock_gettime(CLOCK_MONOTONIC, &deadline);
// Add the time you want to sleep
deadline.tv_nsec += 1000;
// Normalize the time to account for the second boundary
if(deadline.tv_nsec >= 1000000000) {
deadline.tv_nsec -= 1000000000;
deadline.tv_sec++;
}
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &deadline, NULL);
Note that I'm using CLOCK_MONOTONIC instead of CLOCK_REALTIME. You don't actually care what time it is, you just want the clock to be consistent.
回答3:
@ryanyuyu
sample code::
void mysleep_ms(int milisec)
{
struct timespec res;
res.tv_sec = milisec/1000;
res.tv_nsec = (milisec*1000000) % 1000000000;
clock_nanosleep(CLOCK_MONOTONIC, 0, &res, NULL);
}
this is monotonic clock based sleep function. please refer it.
回答4:
I recommend 2nd way of use sleep function. because , most of system function uses CLOCK_REALTIME, But, It has some serious problem, If system time and date has changed. In most case I recommend relative sleep way , best choice is using clock_monotonic.
来源:https://stackoverflow.com/questions/20332382/linux-sleeping-with-clock-nanosleep