nanosleep() - Unix,Linux系统调用
Tutorials Point


  Unix入门
  Unix Shell编程
  高级Unix
  Unix有用参考
  Unix有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考文献     讨论论坛     关于TP  

nanosleep() - Unix,Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

nanosleep - 暂停执行指定时间

概要

#define _POSIX_C_SOURCE 199309 #include <time.h>

int nanosleep(const struct timespec *req, struct timespec *rem);

描述

nanosleep() 至少延迟程序执行*req中指定的时间。如果已向进程传递信号,则函数可以提前返回。在这种情况下,它返回 -1,将errno设置为EINTR,并将剩余时间写入rem指向的结构体中,除非rem为 NULL。然后可以使用*rem的值再次调用nanosleep() 并完成指定的暂停。

timespec结构用于指定具有纳秒精度的间隔时间。它在<time.h>中指定,其形式为:

struct timespec {
    time_t tv_sec;        /* seconds */
    long   tv_nsec;       /* nanoseconds */
};

纳秒字段的值必须在 0 到 999999999 范围内。

sleep(3) 和usleep(3) 相比,nanosleep() 的优势在于它不会影响任何信号,它符合 POSIX 标准,它提供更高的计时分辨率,并且它允许更容易地继续被信号中断的睡眠。

返回值

如果成功休眠了请求的间隔时间,nanosleep() 返回 0。如果调用被信号处理程序中断或遇到错误,则返回 -1,并设置errno以指示错误。

错误

标签描述
EFAULT 从用户空间复制信息时出现问题。
EINTR 暂停已被传递给进程的非阻塞信号中断。剩余的睡眠时间已写入 *rem,以便进程可以轻松地再次调用nanosleep() 并继续暂停。
EINVAL tv_nsec字段中的值不在 0 到 999999999 范围内,或者tv_sec为负。

缺陷

nanosleep() 的当前实现基于普通的内核定时器机制,其分辨率为 1/HZ s(参见time(7))。因此,nanosleep() 总是至少暂停指定的时间,但是直到进程再次可运行可能最多需要 10 毫秒的时间。出于同样的原因,在 *rem 中传递信号时返回的值通常会四舍五入到下一个较大的 1/HZ s 的倍数。

旧行为

为了支持需要更精确暂停的应用程序(例如,为了控制某些时间关键型硬件),当从像SCHED_FIFOSCHED_RR这样的实时策略下调度的进程调用nanosleep() 时,它将通过繁忙等待以微秒精度处理最多 2 毫秒的暂停。此特殊扩展已在内核 2.5.39 中移除,因此它仍然存在于当前的 2.4 内核中,但不存在于 2.6 内核中。

在 Linux 2.4 中,如果nanosleep() 被信号(例如,SIGTSTP)停止,则在进程被 SIGCONT 信号恢复后,调用将返回错误EINTR。如果随后重新启动系统调用,则进程在停止状态下花费的时间将计入睡眠间隔。

符合标准

POSIX.1-2001。

参见



previous next Printer Friendly

广告


  

广告



广告