nanosleep()使得进程进入睡眠状态,指定时候后唤醒进程,sleep()基于其实现

  1. asmlinkage long sys_nanosleep(struct timespec *rqtp, struct timespec *rmtp)//第一个指针rqtp指向给定所需睡眠时间的数据结构;第二个指针rmtp,指向返回剩余时间的数据结构,可能收到信号提前唤醒.
  2. {
  3. struct timespec t;//tv_sec单位秒,tv_nsec单位好微妙
  4. unsigned long expire;
  5. if(copy_from_user(&t, rqtp, sizeof(struct timespec)))//所需睡眠时间从用户空间复制到内核空间
  6. return -EFAULT;
  7. if (t.tv_nsec >= 1000000000L || t.tv_nsec < 0 || t.tv_sec < 0)
  8. return -EINVAL;
  9. if (t.tv_sec == 0 && t.tv_nsec <= 2000000L &&
  10. current->policy != SCHED_OTHER)//由于时钟中断只能达到10毫秒的精度,如果要求睡眠的时间小于2毫秒,而要求睡眠的进程又是个实时要求的进程,那就不能真的让这个进程进入睡眠,因为那样有可能10毫秒以后才能将其唤醒,对于实时进程来说是不能接受的
  11. {
  12. /*
  13. * Short delay requests up to 2 ms will be handled with
  14. * high precision by a busy wait for all real-time processes.
  15. *
  16. * Its important on SMP not to do this holding locks.
  17. */
  18. udelay((t.tv_nsec + 999) / 1000);//延迟两秒
  19. return 0;
  20. }
  21. expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec);//将数据结构t中的数值换算成时钟中断的次数<span style="white-space:pre"> </span>
  22. current->state = TASK_INTERRUPTIBLE;//将当期进程的状态设置为TASK_INTERRUPTIBLE
  23. expire = schedule_timeout(expire);//让当期进程睡眠给定的时间;返回剩余的时钟中断次数,如果没有,返回0
  24. if (expire) {
  25. if (rmtp) {
  26. jiffies_to_timespec(expire, &t);//剩余的时钟中断次数转换成数据结构t的数值
  27. if (copy_to_user(rmtp, &t, sizeof(struct timespec)))//剩余时间从内核空间复制到用户空间
  28. return -EFAULT;
  29. }
  30. return -EINTR;
  31. }
  32. return 0;
  33. }



pause()实现,只有信号才可以唤醒
  1. asmlinkage int sys_pause(void)
  2. {
  3. current->state = TASK_INTERRUPTIBLE;//设置为睡眠状态
  4. schedule();//schdule运行调度
  5. return -ERESTARTNOHAND;
  6. }

最新文章

  1. CSS3 结构伪类选择器 详解
  2. HTML &lt;hr /&gt; 标签 在页面中创建一条水平线
  3. 玩转CSS3,嗨翻WEB前端,CSS3伪类元素详解/深入浅出[原创][5+3时代]
  4. 机器学习Python包
  5. (转)浅谈MD5加密算法中的加盐值(SALT)
  6. 获取网络状态ios(2G、3G、4G、Wifi)
  7. 最完美解决Nginx部署ThinkPHP项目的办法
  8. iOS - 沙盒机制
  9. IT的发展路径
  10. bzoj(矩阵快速幂)
  11. iOS超全开源框架、项目和学习资料汇总:UI篇
  12. Apache设置用户权限(2个域名。一个能访问全部文件,一个只能访问指定文件)
  13. eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样
  14. oracle的部分增删查改
  15. PerformEraseBackground 擦除背景(ThemeServices)
  16. Zabbix agentd 命令
  17. 海港(NOIP2016)
  18. (转)AIX的Dump文件学习笔记
  19. linux 软件包安装方式选择、安装位置、源码包安装
  20. 给Android组件添加事件一个很好用的方法

热门文章

  1. AB test学习笔记
  2. [转载]Failed to read session data On PHP 7.1
  3. JZOJ 3388. 【NOIP2013模拟】绿豆蛙的归宿
  4. C语言分步编译
  5. mongodb安装,库操作,集合操作(表),文档操作(记录)
  6. 基于neo4j图数据库,实现人口关系大图的基本思路及实现方案。
  7. STM32启动文件:startup_stm32f10x_hd.s等启动文件的简单描述
  8. Redis实现之字典
  9. SXCPC2018 nucoj2004 国王的怪癖
  10. Android事件分发机制浅析(3)