在Linux系统中
int nanosleep(const struct timespec *req,struct timespec *rem);
返回值
0 :请示的时间间隔结束。
-1:信号中断或失败,并设置errno。
如果rmtp参数不为空,它所引用的timespec结构更新为包含剩余时间的间隔量(请求的时间减去实际睡眠时间)。如果rmtp参数为NULL,不返回的剩余时间。
描述
这个函数功能是暂停某个进程直到你规定的时间后恢复,参数req就是你要暂停的时间,其中req->tv_sec是以秒为单位,而tv_nsec以纳秒为单位(10的-9次方秒)。由于调用nanosleep是使进程进入TASK_INTERRUPTIBLE,这就意味着有可能会没有等到你规定的时间就因为其它信号而唤醒,此时函数返回-1,且剩余的时间会被记录在rem中。
这个函数的实现是:将其状态设置成TASK_INTERRUPTIBLE,脱离就绪队列,然后进行一次进程调度再由内核在规定的时间后发送信号来唤醒这个进程。
我们假设时钟种中断是10纳秒一次,如果tv_sec = 0, tv_nsec = 2,那么时钟中断一定是在10纳秒后来唤醒这个进程的,这里我们看到任务的重新调度最少是在10纳秒之上,因此此函数的精确程度与时钟频率有关系,不过我们一般也不会延时在中断级别的时间范围内。
另外还有的睡眠函数如下:
sleep()
Linux中并没有提供系统调用sleep(),sleep()是在库函数中实现的,它是通过调用alarm()来设定报警时间,调用sigsuspend()将进程挂起在信号SIGALARM上。因此它的实现机制与nanosleeep不同
usleep()
该函数在各平台上的实现不太好,建议不要使用,在有些平台上直接内部转换为nanosleep调用
还可以使用select来达到目的
struct timeval delay;
delay.tv_sec = 0;
delay.tv_usec = 20 * 1000; // 20 ms
select(0, NULL, NULL, NULL, &delay);
select的优点是精度高。
int nanosleep(const struct timespec *req,struct timespec *rem);
返回值
0 :请示的时间间隔结束。
-1:信号中断或失败,并设置errno。
如果rmtp参数不为空,它所引用的timespec结构更新为包含剩余时间的间隔量(请求的时间减去实际睡眠时间)。如果rmtp参数为NULL,不返回的剩余时间。
描述
这个函数功能是暂停某个进程直到你规定的时间后恢复,参数req就是你要暂停的时间,其中req->tv_sec是以秒为单位,而tv_nsec以纳秒为单位(10的-9次方秒)。由于调用nanosleep是使进程进入TASK_INTERRUPTIBLE,这就意味着有可能会没有等到你规定的时间就因为其它信号而唤醒,此时函数返回-1,且剩余的时间会被记录在rem中。
这个函数的实现是:将其状态设置成TASK_INTERRUPTIBLE,脱离就绪队列,然后进行一次进程调度再由内核在规定的时间后发送信号来唤醒这个进程。
我们假设时钟种中断是10纳秒一次,如果tv_sec = 0, tv_nsec = 2,那么时钟中断一定是在10纳秒后来唤醒这个进程的,这里我们看到任务的重新调度最少是在10纳秒之上,因此此函数的精确程度与时钟频率有关系,不过我们一般也不会延时在中断级别的时间范围内。
另外还有的睡眠函数如下:
sleep()
Linux中并没有提供系统调用sleep(),sleep()是在库函数中实现的,它是通过调用alarm()来设定报警时间,调用sigsuspend()将进程挂起在信号SIGALARM上。因此它的实现机制与nanosleeep不同
usleep()
该函数在各平台上的实现不太好,建议不要使用,在有些平台上直接内部转换为nanosleep调用
还可以使用select来达到目的
struct timeval delay;
delay.tv_sec = 0;
delay.tv_usec = 20 * 1000; // 20 ms
select(0, NULL, NULL, NULL, &delay);
select的优点是精度高。