【Linux】延时函数sleep、usleep、nanosleep、select、pselect的比较
1、简介
sleep()-------以秒为单位
#include<unistd.h>
unsigned int sleep(unsigned int seconds);
return:若进程暂停到参数seconds 所指定的时间,成功则返回0,若有信号中断则返回剩余秒数。
在linux中,sleep是通过nanosleep实现的。在一些其他系统中(例如POSIX.1),它是通过alarm()来实现的。
usleep()----以微秒为单位
#include<unistd.h>
unsigned int usleep(unsigned int useconds);
return:若进程暂停到参数seconds 所指定的时间,成功则返回0,若有信号中断则返回剩余微秒数。
nanosleep( )---------以纳秒为单位
#include<time.h>
struct timespec
{
time_t tv_sec; /* 秒seconds /
long tv_nsec; / 纳秒nanoseconds */
};
int nanosleep(const struct timespec req, struct timespec rem);
return: 若进程暂停到参数req所指定的时间,成功则返回0,若有信号中断则返回-1,并且将剩余微秒数记录在rem中。
req->tv_sec是以秒为单位,而tv_nsec以毫微秒为单位(10的-9次方秒)。
由于调用nanosleep是是进程进入TASK_INTERRUPTIBLE,这种状态是会相应信号而进入TASK_RUNNING状态的。
2、注意
使用这些函数时一定要注意判断返回值。有时候会出现sleep函数被系统中断的情况,导致结果不符合预期。
while (nanosleep(&ts, &ts) == -1 && errno == EINTR) {}
3、精确度对比
低精度情况(100000us及以上):usleep和nanosleep表现差不多。select和pselect表现较差。
高精度情况(100000us及以上):四者表现差不多。
fuction time(usec) realtime reduce
----------------------------------------------------usleep 500000 500091 91nanosleep 500000 500089 89select 500000 500540 540pselect 500000 500549 549
--------------------------------usleep 100000 100078 78nanosleep 100000 100110 110select 100000 100157 157pselect 100000 100149 149
--------------------------------usleep 50000 50091 91nanosleep 50000 50107 107select 50000 50111 111pselect 50000 50084 84
--------------------------------usleep 10000 10086 86nanosleep 10000 10091 91select 10000 10089 89pselect 10000 10088 88
--------------------------------usleep 1000 1089 89nanosleep 1000 1065 65select 1000 1065 65pselect 1000 1066 66
--------------------------------usleep 900 969 69nanosleep 900 974 74select 900 970 70pselect 900 980 80
--------------------------------usleep 500 569 69nanosleep 500 565 65select 500 569 69pselect 500 569 69
--------------------------------usleep 100 166 66nanosleep 100 165 65select 100 163 63pselect 100 163 63
--------------------------------usleep 10 73 63nanosleep 10 76 66select 10 73 63pselect 10 78 68
--------------------------------usleep 1 64 63nanosleep 1 66 65select 1 65 64pselect 1 63 62
--------------------------------
4、测试代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<sys/time.h>
#include<errno.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/select.h>int main(int argc, char **argv)
{unsigned int nTimeTestSec = 0;unsigned int nTimeTest = 0;struct timeval tvBegin;struct timeval tvNow;int ret = 0;unsigned int nDelay = 0;struct timeval tv;int fd = 1;int i = 0;struct timespec req;unsigned int delay[20] = {500000, 100000, 50000, 10000, 1000, 900, 500, 100, 10, 1, 0};int nReduce = 0; //误差fprintf(stderr, "%19s%12s%12s%12s\n", "fuction", "time(usec)", "realtime", "reduce");fprintf(stderr, "----------------------------------------------------\n");for (i = 0; i < 20; i++){if (delay[i] <= 0)break;nDelay = delay[i];//test sleepgettimeofday(&tvBegin, NULL);ret = usleep(nDelay);if(ret == -1){fprintf(stderr, "usleep error, errno=%d [%s]\n", errno, strerror(errno));}gettimeofday(&tvNow, NULL);nTimeTest = (tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec - tvBegin.tv_usec;nReduce = nTimeTest - nDelay;fprintf (stderr, "\t usleep %8u %8u %8d\n", nDelay, nTimeTest,nReduce);//test nanosleepreq.tv_sec = nDelay/1000000;req.tv_nsec = (nDelay%1000000) * 1000;gettimeofday(&tvBegin, NULL);ret = nanosleep(&req, NULL);if (-1 == ret){fprintf (stderr, "\t nanousleep %8u not support\n", nDelay);}gettimeofday(&tvNow, NULL);nTimeTest = (tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec - tvBegin.tv_usec;nReduce = nTimeTest - nDelay;fprintf (stderr, "\t nanosleep %8u %8u %8d\n", nDelay, nTimeTest,nReduce);//test selecttv.tv_sec = 0;tv.tv_usec = nDelay;gettimeofday(&tvBegin, NULL);ret = select(0, NULL, NULL, NULL, &tv);if (-1 == ret){fprintf(stderr, "select error. errno = %d [%s]\n", errno, strerror(errno));}gettimeofday(&tvNow, NULL);nTimeTest = (tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec - tvBegin.tv_usec;nReduce = nTimeTest - nDelay;fprintf (stderr, "\t select %8u %8u %8d\n", nDelay, nTimeTest,nReduce);//pselcetreq.tv_sec = nDelay/1000000;req.tv_nsec = (nDelay%1000000) * 1000;gettimeofday(&tvBegin, NULL);ret = pselect(0, NULL, NULL, NULL, &req, NULL);if (-1 == ret){fprintf(stderr, "select error. errno = %d [%s]\n", errno, strerror(errno));}gettimeofday(&tvNow, NULL);nTimeTest = (tvNow.tv_sec - tvBegin.tv_sec) * 1000000 + tvNow.tv_usec - tvBegin.tv_usec;nReduce = nTimeTest - nDelay;fprintf (stderr, "\t pselect %8u %8u %8d\n", nDelay, nTimeTest,nReduce);fprintf (stderr, "--------------------------------\n");}return 0;
}
参考博客:https://www.jianshu.com/p/42abcc2c9e50
相关文章:

特斯拉解锁对汽车电池容量的软件限制,以帮助用户逃离飓风危险
为了对抗飓风,为用户提高逃生的可能性,特斯拉公司在此特殊情况下免费释放了电池容量限制。 据悉,在伊斯玛飓风抵达佛罗里达州之前,特斯拉为佛罗里达特斯拉的电动汽车用户更新解锁了其60kwh型号下电动汽车被封住的电池容量&#x…

nginx安装 问题 1
./configure: error: the HTTP rewrite module requires the PCRE library 有时候,我们需要单独安装nginx,来处理大量的下载请求。单独在Centos5安装nginx遇到的rewrite和HTTP cache错误解决办法:wget http://nginx.org/download/nginx-0.8.3…

【Qt】使用QPalette设置按钮颜色时,不生效
1、问题描述 在练习QStylePlugin示例时,通过插件将按钮颜色设置为红色,但是没有效果,原因是: 使用QPalette设置按钮颜色时,不生效,代码如下 QPalette.setBrush(QPalette::Button, Qt::red)2、问题分析 Q…

Swagger 生成 PHP restful API 接口文档
需求和背景 需求: 为客户端同事写接口文档的各位后端同学,已经在各种场合回忆了使用自动化文档工具前手写文档的血泪史.我的故事却又不同,因为首先来说,我在公司是 Android 组负责人,属于上述血泪史中催死人不偿命的客户端阵营.但血泪史却是相通的,没有自动化文档的日子,对接口…

FPGA技术的未来发展:谁与AI平分秋色
参加 2019 Python开发者日,请扫码咨询 ↑↑↑作者 | 老石来源 | 老石谈芯(公众号id:gh_5ce1d0cb1568)责编 | Jane任何科学技术的发展和进步都离不开两个主要的推动力量,一个是相关领域各大公司的研发,另一个…

一体化设计让容灾变简单
容灾很难实现吗?容灾不仅包括技术方面的问题,而且涉及数据保护策略、投入产出比等方面的问题。从这个角度讲,对于大多数的中小型用户来说,容灾的实施确实比较困难。不过,爱数软件副总裁李基亮认为,容灾的实…

深度研究自然梯度优化,从入门到放弃 | Deep Reading
参加 2019 Python开发者日,请扫码咨询 ↑↑↑作者 | Cold Marie Wild译者 | 刘畅责编 | Jane出品 | AI科技大本营(公众号id:rgznai100)【导语】根据自然梯度的支持者提出一种建议:我们不应该根据参数空间中的距离来定义…

【Qt】QtCreator中关于Style Plugin Example没有效果的修改方法
1、问题描述 在QtCreator练习QStylePlugin的例子时,没有效果,原因是QPalette使用不当造成。 详见:https://blog.csdn.net/u010168781/article/details/88250451 2、解决方法 解决方法很简单,我们只是为了演示QStylePlugin的效果,然而QPushButton不能通过QPalette来改变…

最大公约数和最小公倍数的欧几里得算法
最大公约数的算法竟然如此简单,不说了,见代码 #include <stdio.h> int gcd(int a, int b) { if(b 0) return a; return gcd(b, a%b); } 简化后如下: int gcd(int a, int b) { return (b0 ? a: gcd(b, a%b)); } 而最小公倍数的也就为&a…

如何查看CISCO FWSM上ACL分区的空闲资源
在CISCO防火墙模块上有的时候在做策略NAT的时候会碰到如下的错误信息:输入:nat (inside) 1 access-list XYZ错误提示:ERROR: Unable to add Policy Rulesaccess-list XYZ 可以在配置的ACL中显示尤其在添加一些基于策略的NAT的时候,因为其可能会产生大量的…

强烈推荐一款Python可视化神器!
参加 2019 Python开发者日,请扫码咨询 ↑↑↑翻译 | Lemon来源 | Plotly出品 | Python数据之道 (ID:PyDataRoad)Plotly Express 入门之路Plotly Express 是一个新的高级 Python 可视化库:它是 Plotly.py 的高级封装&am…

【Qt】QIcon::fromTheme:从系统主题中获取图标
1、简介 函数原型 QIcon QIcon::fromTheme(const QString &name) QIcon QIcon::fromTheme(const QString &name, const QIcon &fallback)上述两个函数可以从系统主题中获取图标,后者可以在主题中找不到图标时,再使用自己定义的图标&#x…

检验EIGRP
路由器必须与其邻居建立邻接关系,EIGRP 才能发送或接收更新。EIGRP 路由器通过与相邻路由器交换 EIGRP Hello 数据包来建立邻接关系。 使用 show ip eigrp neighbors 命令来查看邻居表并检验 EIGRP 是否已与其邻居建立邻接关系。对于每台路由器,您应该能…

【Qt】通过QtCreator源码学习Qt(十):多国语言支持
1、获取系统支持的语言 QStringList uiLanguages;uiLanguages = QLocale::system().uiLanguages();2、从设置中获取想要显示的语言,尝试覆盖默认的 QString overrideLanguage = settings->value(QLatin1String("General/OverrideLanguage")).toString();if (!ove…

吴恩达最新斯坦福课程《深度学习》全部视频已送达,请签收!
参加 2019 Python开发者日,请扫码咨询 ↑↑↑责编 | Jane出品 | AI科技大本营(公众号id:rgznai100)【导语】2018 年秋季,吴恩达教授在斯坦福新开了一门 CS230《深度学习》课程,近期,该课程的视频…

mysql 5.7 修改root 密码
前言 MySQL5.7为了加强安全性,yum 安装后为root用户随机生成了一个密码,同时修改root密码上,也增加了一些校验,会报 Your password does not satisfy the current policy requirements 错误。 安装 rpm -ivh http://repo.mysql.co…

2-7-PatchesAdministration
/cdrom/sol_10_305_x86/s2/Solaris_10/Product 下是包含系统自带的补丁包 该目录下的包需要复制到/var/spool/pkg目录下再使用pkgadd才可以被安装cp -r SUNWi15cs /var/spool/pkgpkgadd SUNWi15cs2-7系统补丁管理补丁类型:standard patchesrecommended patchesfirmw…

【Qt】通过QtCreator源码学习Qt(十一):Utils::Icon,根据不同主题、不同状态变换图标
1、简介 在QtCreator中Utils::Icon封装的图标可以根据主题变换,还可以设置不同状态下的图标的颜色。不同状态下的颜色变换,由QIcon::addPixmap函数实现: void QIcon::addPixmap(const QPixmap &pixmap, Mode mode = Normal, State state = Off)2、源码分析 src/libs/…

Python_赋值和深浅copy
Python中赋值和深浅copy存储变化 在刚学python的过程中,新手会对python中赋值、深浅copy的结果感到丈二和尚。经过多次在网上查找这几个过程的解释说明以及实现操作观察,初步对这几个过程有了浅显的认识。以下内容仅是我在学习过程中遇到的问题&…

萌新养成 | AI科技大本营实习生招募计划
金三银四跳槽季这个时候需要做好准备的可不仅仅只有在职或者离职的萝卜尚未毕业的萌新也需要提早做准备了毕竟把自己修炼成一个优秀的萝卜也不是一件容易的事所以,放下你找对象、刷副本、世界游的想法加入我们为你量身定制的人才培养计划加入营长的团队,…

踏上云旅程 存储准备好了吗
在云计算的概念刚出现时,人们习惯将原始数据存在本地,而将备份数据放到云中。随着云计算技术和应用逐渐走向成熟,人们可能会把原始数据存在云中,而把备份数据放在本地。全球存储网络工业协会(SNIA)主席Wayn…

UCloud与NTT达成合作,提供可靠跨地域混合云服务
近日,UCloud宣布与NTT Communications东亚地区总部NTT Com Asia (以下简称“NTT Com Asia”) 达成合作伙伴协议。双方将发挥各自优势,通过UCloud云服务与NTT Communications企业级 Enterprise Cloud 服务互联互通,为国内企业以及进入中国的跨…

ICCV 2019论文投稿数破纪录,中科院、清华名列前茅,苹果垫底
参加 2019 Python开发者日,请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营(ID:rgznai100)昨日,作为计算机视觉领域里顶级会议这一的 International Conference on Computer Vision (ICCV)公布了 2019 年…

【linux】在CentOS7上更改端口号时报错:Job for sshd.service failed because the control process exited with error
1、问题描述 在在CentOS7上更改端口号时报错: Job for sshd.service failed because the control process exited with error code.See “systemctl status sshd.service” and “journalctl -xe” for details. 2、修改ssh端口号的方法 修改:$ sudo …

硅谷风投押注计算机网络安全市场
今天,新浪转载了一篇外媒报道,称随着一系列安全事件的集中爆发,风险投资家们业从计算机安全领域看到了机会,希望加大对这一市场的投资。 文章最后指未来几年可能上市的公司包括:梭子鱼、Proofpoint、Palo Alto Network…

Tensorflow框架是如何支持分布式训练的?
参加 2019 Python开发者日,请扫码咨询 ↑↑↑作者 | 杨旭东转载自知乎《算法工程师的自我修养》专栏Methods that scale with computation are the future of AI. —Rich Sutton, 强化学习之父大数据时代的互联网应用产生了大量的数据,这些数据就好比是石…

【linux】SELinux工具:semanage的安装和使用
1、安装 在ubuntu14.04上安装 sudo apt-get install policycoreutils在CentOS7上安装 sudo yum -y install policycoreutils-python2、semanage命令行参数 $ semanage --help semanage用于配置SELinux策略的某些元素,而不需要对策略源进行修改或重新编译。 位置…

在阿里云Kubernetes容器服务上打造TensorFlow实验室
简介 Jupyter notebook是强大的数据分析工具,它能够帮助快速开发并且实现机器学习代码的共享,是数据科学团队用来做数据实验和组内合作的利器,也是机器学习初学者入门这一个领域的好起点。 而TensorFLow是深度学习和机器学习最流行的开源框架…

PagedGeometry 笔记03
1. 创建草 PagedGeometry *grass new PagedGeometry(mCamera,50); grass->addDetailLevel<GrassPage>(100); // 在100单位内绘草。 GrassLoader *grassLoader new GrassLoader(grass); grass->setPageLoader(grassLoader); grassLoader->setH…

【Qt中文手册】QSortFilterProxyModel
1、说明 QSortFilterProxyModel类继承自QAbstractProxyModel是一个代理类,存在于另一模型Model和视图View之间,将另一个模型排序或者过滤后在视图上显示。 2、简单示例 没有使用代理的项视图模型代码如下 QTreeView *treeView = new QTreeView; MyItemModel *model = new…