Linux中的sleep、usleep、nanosleep、poll和select
在进行Linux C/C++编程时,可调用的sleep函数有好多个,那么究竟应当调用哪一个了?下表列出了这几个函数间的异同点,可作为参考:
|
性质 |
精准度 |
线程安全 |
信号安全 |
||
|
sleep |
libc库函数 |
秒 |
是 |
不能和alarm同时使用 |
有些是基于alarm实现的,所以不能和alarm同时使用 |
|
usleep |
libc库函数 |
微秒 |
- |
- |
POSIX.1-2001已将usleep标注为废弃,POSIX.1-2008已删除usleep,应当使用nanosleep替代usleep |
|
nanosleep |
系统调用 |
纳秒 |
是 |
不确定 |
即使被信号中断,也可实现实际睡眠时长不小于参数指定时长 |
|
clock_nanosleep |
系统调用 |
纳秒 |
是 |
不确定 |
区别于nanosleep,可选择为相对或绝对时间,其次是可以选择使用哪个时钟 |
|
poll |
系统调用 |
毫秒 |
是 |
是 |
在协程库libco中可安全使用,如被信号中断,则实际睡眠时长会小于参数指定的时长 |
|
ppoll |
系统调用 |
纳秒 |
是 |
是 |
如被信号中断,则实际睡眠时长会小于参数指定的时长 |
|
select |
系统调用 |
微秒 |
是 |
是 |
即使被信号中断,也可实现实际睡眠时长不小于参数指定时长 |
|
pselect |
系统调用 |
纳秒 |
是 |
是 |
如被信号中断,则实际睡眠时长会小于参数指定的时长 |
C/C++常用封装:
1) 基于nanosleep的毫秒级封装
|
#include <time.h> void millisleep(uint32_t milliseconds) { struct timespec ts = { milliseconds / 1000, (milliseconds % 1000) * 1000000 }; while ((-1 == nanosleep(&ts, &ts)) && (EINTR == errno)); } |
2) 基于nanosleep的微秒级封装
|
#include <time.h> void microsleep(uint32_t microseconds) { struct timespec ts = { microseconds / 1000000, (microseconds % 1000000) * 1000 }; while ((-1 == nanosleep(&ts, &ts)) && (EINTR == errno)); } |
3) 基于poll的秒级封装
|
// 可libco协程库中安全使用 void pollsleep(int milliseconds) { (void)poll(NULL, 0, milliseconds); } |
4) 基于select的毫秒级封装
|
void selectsleep(int milliseconds) { struct timeval timeout = { milliseconds / 1000, (milliseconds % 1000) }; struct timeval old_timeout = { timeout.tv_sec, timeout.tv_usec }; while (true) { (void)select(0, NULL, NULL, NULL, &timeout); if (timeout.tv_sec<=0 && timeout.tv_usec<=0) break; } } |
如果开发环境是C++11或更高版本,则可直接使用C++标准库提供的:
5) 毫秒睡眠
|
#if __cplusplus >= 201103L #include <chrono> #include <system_error> #include <thread> std::this_thread::sleep_for(std::chrono::milliseconds(1000)); #endif // __cplusplus >= 201103L |
6) 微秒睡眠
|
#if __cplusplus >= 201103L #include <chrono> #include <system_error> #include <thread> std::this_thread::sleep_for(std::chrono::microseconds(1000)); #endif // __cplusplus >= 201103L |
上述介绍的sleep函数均不方便控制它们提前结束,如果需要这种sleep,可基于pthread_cond_timedwait实现,实现可参考CEvent源码:
|
https://github.com/eyjian/libmooon/blob/master/src/sys/event.cpp |
Linux中的sleep、usleep、nanosleep、poll和select的更多相关文章
- Linux下的微秒级定时器: usleep, nanosleep, select, pselect
Linux下的微秒级定时器: usleep, nanosleep, select, pselect 标签: linuxnulldelaystructdate 2012-02-07 23:29 4979 ...
- Linux的sleep()和usleep()的使用和区别
Linux的sleep()和usleep()的使用和区别 函数名: sleep头文件: #include <windows.h> // 在VC中使用带上头文件 #include <u ...
- 聊聊 Linux 中的五种 IO 模型
本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538919&idx=1&sn=6013c451 ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- Linux中C/C++头文件一览
1.Linux中一些头文件的作用: #include <assert.h> //ANSI C.提供断言,assert(表达式) #include <glib.h> ...
- Linux中的IO复用接口简介(文件监视?)
I/O复用是Linux中的I/O模型之一.所谓I/O复用,指的是进程预先告诉内核,使得内核一旦发现进程指定的一个或多个I/O条件就绪,就通知进程进行处理,从而不会在单个I/O上导致阻塞. 在Linux ...
- 解析Linux中的VFS文件系统之文件系统的来源与简介(一)
最近挂载了N多的文件系统,大致了不同文件系统的相应特性及挂载方式,却还是对Linux的文件系统没有从源码方面去了解.不求甚解确实不好不好. 于是借鉴一些大牛的博客及自己的理解,总结了博客系列: 一.V ...
- Linux的sleep()和usleep()
1.sleep和usleep都是linux中的程序挂起函数.只是时间的单位不一样. 2. sleep的基本单位是s(秒),也可以用m(分).h(小时). 例: sleep 1 : 挂起1秒 sleep ...
- Linux中Nginx安装与配置详解
转载自:http://www.linuxidc.com/Linux/2016-08/134110.htm Linux中Nginx安装与配置详解(CentOS-6.5:nginx-1.5.0). 1 N ...
随机推荐
- 将之前的Power idea公司的数据按照下图所示的格式在屏幕上显示出来。
之前的文章 示例代码如下 assume cs:codesg ;将整个data段看作是一个数组,长度一共为 ;21*4+21*4+2*21=168+42=210字节 data segment db ' ...
- YII2中使用RBAC对模块,控制器,方法的权限控制以及规则的使用
在使用YII2中自带的RBAC时,需要先配置config/web.php: return [ // ... 'components' => [ 'authManager' => [ 'cl ...
- Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用[z]
前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
- Windows Server 2008 MetaFile设置占用内存限制
最近遇到Windows Server 2008服务器内存持续飙升,48G内存用了99%,查看任务管理器的进程,也没发现具体哪个进程用的内存比较大? 于是,在网上找了了一个查看内存的工具RamMap,具 ...
- div中的img垂直居中的方法,最简单! 偷学来的,,,不要说我抄袭啊(*^__^*)
让div中的img垂直居中,水平居中很简单,用text-align:center; 让div中img垂直居中的方法其实也很简单 重点是: display:table-cell; 让标签具有表格的属 ...
- C# fckeditor添加上传附件功能
最近在维护系统时,要把fckediotr加上上传附件功能,好久没有用fckeditor了,现在都已经改名字,不叫这个了. 修改统计器下面的fckconfig.js,方法如下: 1.把FCKConfig ...
- poj 2828(线段树 逆向思考) 插队是不好的行为
http://poj.org/problem?id=2828 插队问题,n个人,下面n行每行a,b表示这个人插在第a个人的后面和这个人的编号为b,最后输出队伍的情况 涉及到节点的问题可以用到线段树,这 ...
- 转录组分析综述A survey of best practices for RNA-seq data analysis
转录组分析综述 转录组 文献解读 Trinity cufflinks 转录组研究综述文章解读 今天介绍下小编最近阅读的关于RNA-seq分析的文章,文章发在Genome Biology 上的A sur ...
- Windows cordova build Error: Could not find gradle wrapper within Android SDK.(转)
原文:http://blog.csdn.net/kongxx/article/details/68954151 在Windows7上运行 “cordova build Android” 报错,如下: ...
- Luogu 1641[SCOI2010]生成字符串 - 卡特兰数
Description 有$N$ 个 $1$ 和 $M$ 个 $0$ 组成的字符串, 满足前 $k$ 个字符中 $1$ 的个数不少于 $0$ 的个数. 求这样字符串的个数. $1<=M < ...