(转自:https://blog.csdn.net/hbuxiaofei/article/details/46416605?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1)

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

struct timespec

{

time_t  tv_sec;         /* seconds */

long    tv_nsec;        /* nanoseconds */

};

这个函数功能是暂停某个进程直到你规定的时间后恢复,参数req就是你要暂停的时间,其中req->tv_sec是以秒为单位,而tv_nsec以纳秒为单位(10的-9次方秒)。由于调用nanosleep是使进程进入TASK_INTERRUPTIBLE,这就意味着有可能会没有等到你规定的时间就因为其它信号而唤醒,此时函数返回-1,且剩余的时间会被记录在rem中。

这个函数的实现是:将其状态设置成TASK_INTERRUPTIBLE,脱离就绪队列,然后进行一次进程调度再由内核在规定的时间后发送信号来唤醒这个进程。

我们假设时钟种中断是10纳秒一次,如果tv_sec = 0, tv_nsec = 2,那么时钟中断一定是在10纳秒后来唤醒这个进程的,这里我们看到任务的重新调度最少是在10纳秒之上,因此此函数的精确程度与时钟频率有关系,不过我们一般也不会延时在中断级别的时间范围内。

下面我们再来比较linux下nanosleep() 和usleep、sleep()的区别

sleep()

usleep()

nanosleep()

sleep()和nanosleep()都是使进程睡眠一段时间后被唤醒,但是二者的实现完全不同。

Linux中并没有提供系统调用sleep(),sleep()是在库函数中实现的,它是通过调用alarm()来设定报警时间,调用sigsuspend()将进程挂起在信号SIGALARM上。

nanosleep()则是Linux中的系统调用,它是使用定时器来实现的,该调用使调用进程睡眠,并往定时器队列上加入一个timer_list型定时器,time_list结构里包括唤醒时间以及唤醒后执行的函数,通过nanosleep()加入的定时器的执行函数仅仅完成唤醒当前进程的功能。系统通过一定的机制定时检查这些队列(比如通过系统调用陷入核心后,从核心返回用户态前,要检查当前进程的时间片是否已经耗尽,如果是则调用schedule()函数重新调度,该函数中就会检查定时器队列,另外慢中断返回前也会做此检查),如果定时时间已超过,则执行定时器指定的函数唤醒调用进程。当然,由于系统时间片可能丢失,所以nanosleep()精度也不是很高。

另外alarm()也是通过定时器实现的,但是其精度只精确到秒级,另外,它设置的定时器执行函数是在指定时间向当前进程发送SIGALRM信号。

总结一下

sleep 时间单位是秒

usleep的时间单位是微秒

select的精度是微妙,精确

struct timeval delay;

delay.tv_sec = 0;

delay.tv_usec = 20 * 1000; // 20 ms

select(0, NULL, NULL, NULL, &delay);

usleep()有有很大的问题

在一些平台下不是线程安全,如HP-UX以及Linux

usleep()会影响信号

在很多平台,如HP-UX以及某些Linux下,当参数的值必须小于1 * 1000 * 1000也就是1秒,否则该函数会报错,并且立即返回。

大部分平台的帮助文档已经明确说了,该函数是已经被舍弃的函数。

还好,POSIX规范中有一个很好用的函数,nanosleep(),该函数没有usleep()的这些缺点,它的精度是纳秒级。在Solaris的多线程环境下编译器会自动把usleep()连接成nanosleep()。

Linux下短延时推荐使用select函数,因为准确。

再谈 Linux下的nanosleep函数【转】相关推荐

  1. 再谈 Linux下的nanosleep函数

    int nanosleep(const struct timespec *req,struct timespec *rem); struct timespec { time_t  tv_sec;    ...

  2. Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)

    1.exit()函数 exit(int n)  其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...

  3. linux cp mv区别,浅谈Linux下mv和cp命令的区别

    1.功能上的区别 mv:用户可以使用该命令为文件或目录重命名或将文件由一个目录移入另一个目录中. cp: 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中. 2.从inode角度来区分 mv:会 ...

  4. [转帖]关于Linux下的icotl函数

    关于Linux下的icotl函数 最近接触android开发,因为有时间所以就关注了下android的源码,在跟踪源码过程中到最后都会遇到icotl函数,虽然在Symbian中曾经遇到过RSocket ...

  5. 浅谈Linux下的媒体播放器(转)

    浅谈Linux下的媒体播放器(转)[@more@]Linux开放实验室(Linux OpenLab)郝煜.季冰Linux开放实验室校园爱好者小组 陈强(农大).吴迪.雷凌.戴二红.刘志强(北科大)Li ...

  6. sleep头文件linux,Linux下的sleep函数 要用的话得包涵什么头文件啊?

    Linux下的sleep函数 要用的话得需要#include sleep把进程的运行状态改为睡眠,将其从系统可执行队列去掉,这样系统就不会调度到该进程,不会分配CPU时间片,同时根据该进程的睡眠时间, ...

  7. linux父进程中显示子进程pid,请教linux下c语言函数fork父进程打印子进程的PID

    请教linux下c语言函数fork父进程打印子进程的PID 关注:296  答案:2  信息版本:手机版 解决时间 2019-01-14 04:55 雨不眠的下 2019-01-13 12:23 用于 ...

  8. shell for循环1到100_浅谈Linux下shell 编程的for循环常用的6种结构

    浅谈Linux下shell 编程的for循环常用的6种结构 1. 常用for循环结构 (1) for 变量 in 值1 值2 值3... do 程序块儿 done (2) for 变量 in `命令` ...

  9. Linux命令删除find,浅谈Linux下通过find命令进行rm文件删除的小技巧

    我们经常会通过find命令进行批量操作,如:批量删除旧文件.批量修改.基于时间的文件统计.基于文件大小的文件统计等,在这些操作当中,由于rm删除操作会导致目录结构变化,如果要通过find结合rm的操作 ...

最新文章

  1. 架构师之路 — API 经济 — RESTful API
  2. Design Pattern - Mediator(C#)
  3. RandomStringUtils的使用
  4. css就近原则_CSS常用总结 - div-import-border - ItBoth
  5. Hibernate使用createSqlQuery进行模糊查询时找不到数据
  6. 为何腾讯一直在推广“低配版”的QQ
  7. 【论文学习之SNE-RoadSeg】跑通SNE-RoadSeg代码
  8. 语音合成 g2p 字典设计
  9. Waiter,Servant, Attendant的区别
  10. 避风港暗流涌动,优衣库优势不再
  11. android自动改,【玩机组ROM修改教程】自己修改安卓ROM 刷机包教程
  12. 互联网和万维网的区别
  13. 昆仑通泰历史数据导出到u盘_MCGS配方组导出到U盘案例-专业自动化论坛-中国工控网论坛...
  14. Windows10安装Centos7双系统
  15. Python学习 day04打卡
  16. 第三次作业——团队介绍及选题背景与意义
  17. 如何生成一维条码图片
  18. Python3:爬取新浪、网易、今日头条、UC四大网站新闻标题及内容
  19. 奥西工程机服务器不显示窗口,奥西工程复印机常见问题及解决方法
  20. 元宇宙迷思:元宇宙、局与内卷以及一个哲学家关于元宇宙的思考

热门文章

  1. 灵雀云加入,龙蜥社区迎来国内领先的企业级PaaS服务商
  2. java printwriter format,Java PrintWriter类
  3. 【二叉搜索树】c++实现二叉搜索树
  4. Matcher.matcher()与Matcher.find()的区别
  5. 2017测网速5大方法
  6. 自定义View的三种实现方式及自定义属性使用介绍
  7. 服务器北桥芯片,SiS南、北桥芯片蓝图抢先看
  8. oracle1791,安装11G,监听相关问题
  9. Geek Game 1st,叶子的新歌
  10. Python脚本到Windows可执行程序——Cxfreeze的安装与使用