usleep头文件_Linunx的sleep,usleep,select,nonasleep对比与应用
前言
时钟换算:
1秒(s) = 1000 毫秒(ms) = 1,000,000 微秒(μs) = 1,000,000,000 纳秒(ns) = 1,000,000,000,000 皮秒(ps)
程序挂起主要有以下几种:
sleep, usleep, select, pselect, nanosleep;
它们的精度不同,在不同的应用场景下需要不同的函数;
一、用法
1.1 函数名: sleep
头文件:
#include // 在gcc编译器中,使用的头文件因gcc版本的不同而不同
功 能: 执行挂起指定的秒数
语 法: unsigned sleep(unsigned seconds);
示例:
#include
int main()
{
int a;
a=1;
printf("hello");
sleep(a);
printf("world");
return 0;
}
1.2 函数名: usleep
功 能: usleep功能把进程挂起一段时间, 单位是微秒(百万分之一秒);
头文件: #include
语 法:
void usleep(int micro_seconds);
返回值: 无
内容说明:本函数可暂时使程序停止执行。参数 micro_seconds 为要暂停的微秒数(us)。
注 意:
用在Linux的测试环境下面。
参 见:usleep() 与sleep()类似,用于延迟挂起进程。进程被挂起放到reday queue。
是一般情况下,延迟时间数量级是秒的时候,尽可能使用sleep()函数。
如果延迟时间为几十毫秒(1ms = 1000us),或者更小,尽可能使用usleep()函数。这样才能最佳的利用CPU时间.
1.3 函数名:select
功能:I/O多工机制
用来等待文件描述符状态的改变。
头文件:
#include
#include
#include
语法:
int select(int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval*timeout);
参数说明:
maxfdp:最大的文件描述符加1,如果我有三个文件节点1、4、6,那第一个参数就为7(6+1)
readfds:可读文件节点集,类型为fd_set。
通过FD_ZERO(&readfd);初始化节点集;
然后通过FD_SET(fd, &readfd);把需要监听是否可读的节点加入节点集
readfds:可写文件节点集中,类型为fd_set。操作方法和第二个参数一样。
errorfds:检查节点错误集。
timeout:超时参数,类型为struct timeval,用于设置超时时间,
分别可设置秒timeout.tv_sec和微秒timeout.tv_usec。
返回值:
执行成功则返回文件描述符状态已经改变的个数,
如果返回0,则表示在描述符在状态改变前已经超过了timeout时间。
当有错误发生时,返回-1, 且错误原因保存在errno中。
定时器用法:
//test
select tv.tv_sec = 0;
tv.tv_usec = 500000;
ret = select(0, NULL, NULL, NULL, &tv);
if (-1 == ret){
fprintf(stderr, "select error. errno = %d [%s]\n", errno, strerror(errno));
}
1.4 函数名:pselect
功能:I/O多工机制
头文件:
#include
#include
#include
#include
语法:
int pselect(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct timespec* timeout,
const sigset_t *sigmask);
说明:
pselect()和select()作用几乎一样,都是用来等待文件描述符状态的改变,
不过pselect() 还可以判断是否有信号(signal)发生。
定时器用法:
req.tv_sec = nDelay/1000000;
req.tv_nsec = (nDelay%1000000) * 1000;
ret = pselect(0, NULL, NULL, NULL, &req, NULL);
if (-1 == ret){
fprintf(stderr, "select error. errno = %d [%s]\n", errno, strerror(errno));
}
1.5 函数名:nonasleep
功能:
nanosleep()函数会导致当前的线程将暂停执行,直到rqtp参数所指定的时间间隔。
或者在指定时间间隔内有信号传递到当前线程,将引起当前线程调用信号捕获函数或终止该线程。
头文件:
#include
#include
#include
#include
#include
语法:
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
描述:
nanosleep()函数会导致当前的线程将暂停执行,直到rqtp参数所指定的时间间隔。
或者在指定时间间隔内有信号传递到当前线程,将引起当前线程调用信号捕获函数或终止该线程。
暂停时间可能超过请求时间,因为参数值是sleep粒度的整数倍数或者因为其他活动的系统调度。
但是,除了被信号中断的情况下,暂停时间不会少于rqtp指定的时间,由系统时钟CLOCK_REALTIME测量。
使用nanosleep()函数对其他行为没有影响,不堵塞任何信号。
返回值:
0 :请示的时间间隔结束。
-1:信号中断或失败,并设置errno。
如果rmtp参数不为空,它所引用的timespec结构更新为包含剩余时间的间隔量(请求的时间减去实际睡眠时间)。
如果rmtp参数为NULL,不返回的剩余时间。
示例:
req.tv_sec = 0;
req.tv_nsec = 1000;
ret = nanosleep(&req, NULL);
if (-1 == ret) {
fprintf (stderr, "\t nanousleep %8u not support\n", nDelay);
}
二、精确度对比
如果用于一些 C/S 数据交互等 100ms级以上精度的程序挂起,用sleep, usleep都可以。
如果是在多线程应用场景中,如用于音视频数据的同步,需要100ms以下的精度的程序挂起,则只能用select, 和 nanosleep.
这是因为,虽然sleep()和nanosleep()都是使进程睡眠一段时间后被唤醒,但是二者的实现完全不同。
Linux中并没有提供系统调用sleep(),
sleep()是在库函数中实现的,它是通过调用alarm()来设定报警时间,
调用sigsuspend()将进程挂起在信号SIGALARM上。
nanosleep()则是Linux中的系统调用,它是使用定时器来实现的,
该调用使调用进程睡眠,并往定时器队列上加入一个timer_list型定时器,time_list结构里包括唤醒时间以及唤醒后执行的函数,
通过nanosleep()加入的定时器的执行函数仅仅完成唤醒当前进程的功能。
系统通过一定的机制定时检查这些队列(比如通过系统调用陷入核心后,从核心返回用户态前,
要检查当前进程的时间片是否已经耗尽,如果是则调用schedule()函数重新调度,该函数中就会检查定时器队列,另外慢中断返回前也会做此检查),
如果定时时间已超过,则执行定时器指定的函数唤醒调用进程。
三、工程应用
这是FFmpeg的程序挂起,
int av_usleep(unsigned usec)
{
#if HAVE_NANOSLEEP
struct timespec ts = { usec / 1000000, usec % 1000000 * 1000 };
while (nanosleep(&ts, &ts) < 0 && errno == EINTR);
return 0;
#elif HAVE_USLEEP
return usleep(usec);
#elif HAVE_SLEEP
Sleep(usec / 1000);
return 0;
#else
return AVERROR(ENOSYS);
#endif
}
微信号:ywcclzy
usleep头文件_Linunx的sleep,usleep,select,nonasleep对比与应用相关推荐
- c语言usleep头文件,C语言Sleep clock time函数的使用
1.Sleep Sleep函数的功能是让程序挂起一段时间,第一个字母大写,只在VC中使用,头文件为#include,单位为毫秒,若想挂起120毫秒,可以写为: Sleep(120); 在linux g ...
- c++万能头文件_初学Python,与C对比
✎背景学了一学年的C的基础,下学年开课Python,现在正在自学中...C也不是不学了,而是之前买了一本<C++Primer>在学校里,就准备先学一下Python,下学期利用自由时间接着学 ...
- 2013.10.5-7台风“菲特“fitow模拟实例【WRF模拟实操:WRFdomain范围设置,namelist代码,WRF模拟流程,wrfout结果查看头文件,原文对比】
文章目录 前言 一.下载数据 使用python下载FNL资料 二.WPS前处理 0.安装WRFdomain 1.区域设置--namelist.wps 论文提供信息: WRFDomain设置范围 nam ...
- linux gettimeofday 头文件,linux-时间编程-time、gmtime、localtime、asctime、ctime、gettimeofday、sleep、usleep...
时间类型: coordinated universal time(UTC):世界标准时间,也就是格林威治标准时间GMT calendar time:日历时间,是用"从一个标准时间点(如:19 ...
- c语言select函数头文件,简述select函数的功能与调用方法
使用select 首先我们需要解答一些疑惑.为什么要使用select函数? 比如你有一个服务器程序,维护着N多个TCP连接,你如何去判断这些TCP连接上有数据传送过来了呢?最傻瓜的办法就是隔一定时间去 ...
- linux延时函数及头文件,linux延时函数
应用程序的延时函数: 头文件: #include 函数:unsigned int sleep (unsigned int seconds);//n秒 此外:int usleep (useconds_t ...
- linux msleep 头文件,Linux延迟函数
从Linux应用层和内核两方面来区分下延迟函数: 1. 应用层 1> sleep usleep 微秒级 头文件为: 3> nanosleep 相比标准UNIX 的sleep 调用具有更高高 ...
- linux pid t 头文件_linux系统调用相关头文件
Linux C 一些函数 所属的头文件 2011-03-07 10:25:07 分类: LINUX 在编写程序时,有时总是不记得所使用的函数在哪个库函数中.现在先把自己以前经常用到的函数头文件总结一下 ...
- 单片机sleep函数的头文件_C语言中的sleep() 函数
展开全部 关于sleep()函数在windows系统和linux系统下是两个不同的函数,差别较大,但功能是相同的,都是将进程挂起e68a8462616964757a686964616f31333337 ...
最新文章
- H.265 HD 和H.265 4K Video Encoder IP Core
- 7个值得推荐的优质软件,让人忍不住体验!
- 提升深度学习模型性能及网络调参
- java%3e%3e=符号_android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值...
- 不定字段数目的数据库表设计和数据结构
- shell脚本常用参数与格式
- 什么是套接字?Socket基本介绍
- android的热点分配ip_Android 得到连接热点的ip的方法
- NodeJs从零构建代理ip池(一)介绍
- 手机中如何使用阿里云的企业邮箱
- 聚合支付机构备案情况分析(截至22年1月27日)
- Cadence Orcad Capture Place pin的窗口的深入讲解图文
- ST-LINK下载程序出现flash download failed - ‘cortex m4‘
- 联想微型计算机设置从u盘启动,联想笔记本设置u盘为第一启动项教程
- 关于springmvc项目一加入validation-api包就报错的解决方法
- Dell PowerEdge T140服务器安装系统笔记
- 关于XRP需要了解的10件事情
- 毕业设计 单片机智能温控农业大棚系统 - 物联网 嵌入式
- java上传HDFS失败问题File could only be written to 0 of the 1 minReplication nodes.
- JavaScript中6种常见的继承方式