前言

时钟换算:

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对比与应用相关推荐

  1. c语言usleep头文件,C语言Sleep clock time函数的使用

    1.Sleep Sleep函数的功能是让程序挂起一段时间,第一个字母大写,只在VC中使用,头文件为#include,单位为毫秒,若想挂起120毫秒,可以写为: Sleep(120); 在linux g ...

  2. c++万能头文件_初学Python,与C对比

    ✎背景学了一学年的C的基础,下学年开课Python,现在正在自学中...C也不是不学了,而是之前买了一本<C++Primer>在学校里,就准备先学一下Python,下学期利用自由时间接着学 ...

  3. 2013.10.5-7台风“菲特“fitow模拟实例【WRF模拟实操:WRFdomain范围设置,namelist代码,WRF模拟流程,wrfout结果查看头文件,原文对比】

    文章目录 前言 一.下载数据 使用python下载FNL资料 二.WPS前处理 0.安装WRFdomain 1.区域设置--namelist.wps 论文提供信息: WRFDomain设置范围 nam ...

  4. linux gettimeofday 头文件,linux-时间编程-time、gmtime、localtime、asctime、ctime、gettimeofday、sleep、usleep...

    时间类型: coordinated universal time(UTC):世界标准时间,也就是格林威治标准时间GMT calendar time:日历时间,是用"从一个标准时间点(如:19 ...

  5. c语言select函数头文件,简述select函数的功能与调用方法

    使用select 首先我们需要解答一些疑惑.为什么要使用select函数? 比如你有一个服务器程序,维护着N多个TCP连接,你如何去判断这些TCP连接上有数据传送过来了呢?最傻瓜的办法就是隔一定时间去 ...

  6. linux延时函数及头文件,linux延时函数

    应用程序的延时函数: 头文件: #include 函数:unsigned int sleep (unsigned int seconds);//n秒 此外:int usleep (useconds_t ...

  7. linux msleep 头文件,Linux延迟函数

    从Linux应用层和内核两方面来区分下延迟函数: 1. 应用层 1> sleep usleep 微秒级 头文件为: 3> nanosleep 相比标准UNIX 的sleep 调用具有更高高 ...

  8. linux pid t 头文件_linux系统调用相关头文件

    Linux C 一些函数 所属的头文件 2011-03-07 10:25:07 分类: LINUX 在编写程序时,有时总是不记得所使用的函数在哪个库函数中.现在先把自己以前经常用到的函数头文件总结一下 ...

  9. 单片机sleep函数的头文件_C语言中的sleep() 函数

    展开全部 关于sleep()函数在windows系统和linux系统下是两个不同的函数,差别较大,但功能是相同的,都是将进程挂起e68a8462616964757a686964616f31333337 ...

最新文章

  1. H.265 HD 和H.265 4K Video Encoder IP Core
  2. 7个值得推荐的优质软件,让人忍不住体验!
  3. 提升深度学习模型性能及网络调参
  4. java%3e%3e=符号_android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值...
  5. 不定字段数目的数据库表设计和数据结构
  6. shell脚本常用参数与格式
  7. 什么是套接字?Socket基本介绍
  8. android的热点分配ip_Android 得到连接热点的ip的方法
  9. NodeJs从零构建代理ip池(一)介绍
  10. 手机中如何使用阿里云的企业邮箱
  11. 聚合支付机构备案情况分析(截至22年1月27日)
  12. Cadence Orcad Capture Place pin的窗口的深入讲解图文
  13. ST-LINK下载程序出现flash download failed - ‘cortex m4‘
  14. 联想微型计算机设置从u盘启动,联想笔记本设置u盘为第一启动项教程
  15. 关于springmvc项目一加入validation-api包就报错的解决方法
  16. Dell PowerEdge T140服务器安装系统笔记
  17. 关于XRP需要了解的10件事情
  18. 毕业设计 单片机智能温控农业大棚系统 - 物联网 嵌入式
  19. java上传HDFS失败问题File could only be written to 0 of the 1 minReplication nodes.
  20. JavaScript中6种常见的继承方式

热门文章

  1. newlisp 注释生成文档
  2. [转载]Qt之鼠标样式_vortex_新浪博客
  3. 等效全向辐射功率(EIRP)
  4. linux环境c语言编程 蔡晋,Linux环境C语言编程
  5. HTML5中Head内标签详解(一):meta标签
  6. 怎样解决VirtrualBox不能新建64bit的系统的问题
  7. Microsoft Visual Studio Ultimate 2013 RC 离线安装程序
  8. 数据的转换(shp sde mdb 之间的转换)
  9. Oracle数据库重复数据删除的三种情况
  10. C语言指针类型 强制转换