文章目录

  • 1- nanosleep函数
    • (1)函数讲解
    • (2)代码测试
  • 2- usleep函数
    • (1)函数原型
    • (2)函数测试
  • 3- 利用nanosleep函数实现毫秒级函数

我们一般接触比较多的就是sleep函数了,这个的话就不用多说了,大家都知道。我们来介绍一下usleep以及nanosleep函数。

1- nanosleep函数

(1)函数讲解

为什么先介绍nanosleep函数呢?这是因为后面讲到的usleep函数中微妙级的实现是根据nanosleep函数实现的。
函数名称的nano是纳米、纳秒等计量单位的开头字母,一纳秒是10的负9次方秒,是10的负6次方毫秒,是10的负3次方微秒。(后面我们毫秒级的实现也是根据nanosleep函数实现的)
我们man一下nanosleep函数可以看见:

#include <time.h>int nanosleep(const struct timespec *req, struct timespec *rem);

req: struct timespec类型指针,设置休眠的时间
rem: 若remain不为NULL,那么指针指向的缓冲区返回剩余的休眠时间

涉及到的timespec结构体原型:

struct timespec {time_t tv_sec;        /* 秒 */long   tv_nsec;       /* 纳秒 范围是0-999999999(9个9)*/
};

(2)代码测试

/*************************************************************************> File Name: a.c> Author: WangDengtao> Mail: 1799055460@qq.com > Created Time: 2023年01月28日 星期六 19时54分22秒************************************************************************/#include <stdio.h>
#include <time.h>#define s  5          // 5s
#define ns 999999999 // 大概是1sint main(int argc, char *argv[])
{struct timespec s_sleep;struct timespec ns_sleep;s_sleep.tv_sec   = s;ns_sleep.tv_nsec = ns;while(1){nanosleep(&s_sleep, 0);printf("5 seconds passed...\n");printf("\n");nanosleep(&ns_sleep, 0);printf("1 seconds passed...\n");printf("\n");}return 0;
}


可以看见5s以及1s显示出来上述的字符串。
主要函数具体内部是怎么实现的我也不怎么清楚,直接拿来用吧。


2- usleep函数

(1)函数原型

我们在自己的虚拟机中man一下usleep看一下:

#include <unistd.h>int usleep(useconds_t usec);

函数原型:

#include <time.h>
#include <unistd.h>int
usleep (useconds_t useconds)
{struct timespec ts = { .tv_sec = (long int) (useconds / 1000000),.tv_nsec = (long int) (useconds % 1000000) * 1000ul };/* Note the usleep() is a cancellation point.  But since we callnanosleep() which itself is a cancellation point we do not haveto do anything here.  */return __nanosleep (&ts, NULL);
}

具体实现是根据nanosleep函数实现的,其实我们也可以自己去实现ms的级别运算。

(2)函数测试

/*************************************************************************> File Name: a.c> Author: WangDengtao> Mail: 1799055460@qq.com > Created Time: 2023年01月28日 星期六 19时54分22秒************************************************************************/#include <stdio.h>
#include <unistd.h>#define s  5000000  //5sint main(int argc, char *argv[])
{while(1){usleep(s);printf("5 seconds passed...\n");}return 0;
}


可以看见5s会有一次显示。


3- 利用nanosleep函数实现毫秒级函数

/*************************************************************************> File Name: a.c> Author: WangDengtao> Mail: 1799055460@qq.com > Created Time: 2023年01月28日 星期六 19时54分22秒************************************************************************/#include <stdio.h>
#include <unistd.h>
#include <time.h>
#define ms_sleep 5000void mssleep(unsigned long ms);int main(int argc, char *argv[])
{while(1){mssleep(ms_sleep);printf("5 seconds passed...\n");}return 0;
}void mssleep(unsigned long ms)
{struct timespec ts = { .tv_sec  = (long int) (ms / 1000), .tv_nsec = (long int) (ms % 1000) * 1000000ul };nanosleep(&ts, 0);
}


可以看见我们函数主要是根据usleep函数实现的,仿照这来写的函数程序。
其实说实话我们其实直接可以利用微妙级函数直接实现毫秒级的延迟就行。


C语言中usleep与nanosleep函数讲解以及毫秒级休眠实现相关推荐

  1. 三种睡眠时间函数的区别:linux 的sleep()、usleep()、nanosleep()函数

    三种睡眠时间函数的区别:linux 的sleep().usleep().nanosleep()函数 (1)sleep()-------以秒为单位 unsigned int sleep(unsigned ...

  2. C 语言中 char[] 的操作函数

    C语言中char[]的操作函数 1.赋值操作 在C语言中,char型数组是不可以直接赋值的.例如在如下的代码中,会得到错误: char c1[20] = "women"; char ...

  3. c语言printf函数的作用,c语言中printf用法及其函数定义

    c语言中printf用法及其函数定义 发布时间:2020-04-09 10:51:14 来源:亿速云 阅读:354 作者:小新 今天小编给大家分享的是c语言中printf用法及其函数定义,很多人都不太 ...

  4. c语言中val是什么函数,val(val是什么意思)

    有这么一个C语言程序 : int i; long val; for(i=0;i 在C语言中Val是一个将由数字符号(包括正负号.小数点)组成的字符型数据转换成相应的数值型数据的函数,语法格式是Val( ...

  5. c语言中fmod()函数和log10()函数用法

    C语言中fmod函数的功能是x/y的求余运算,适用于double ,float,long double,如果y=0的话,那么返回 值得一提的是%,'%'同样是取余,但是% 适用于整数取余,%是整数的取 ...

  6. c语言getchar函数的作用,c语言中getchar的用法函数用法

    当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止.下面小编就跟你们详细介绍下c语言中getchar的用法,希望对你们有用. c语言中getchar ...

  7. c++ linux 获取毫秒_Linux下gettimeofday()函数和clock()函数:精确到毫秒级的时间

    使用Linux的gettimeofday函数可以达到获取精确到毫秒级的时间,其中t1=t_start.tv_sec是公元1970年至今的时间(换算为秒),t2=t_start.tv_usec是当 前秒 ...

  8. linux 的sleep()、usleep()、nanosleep()函数

    (1)sleep( ) 以秒为单位 (2)usleep( ) 以微秒为单位 (3)nanosleep( ) 以纳秒为单位 1秒(s)= 1000毫秒(ms) 1毫秒 = 1000微秒(us) 1微秒 ...

  9. c语言中gets函数可以输入空格吗_C语言中printf和gets函数的实用技巧

    Printf函数输出的格式与方法: 想要一起学习交流,或者系统学习c++的可以加553014383,邀请码:悟空,裙内有众多资源及解答老师. 1.输出数字的时候存在宽度和精度,那对于数字而言,输出数字 ...

最新文章

  1. java 调用c/c++
  2. [转贴]年薪一万/十万/百万的各样生活
  3. 删除隐藏版本信息 版本回退_git之版本穿梭术
  4. android gridview 按钮事件处理,Android TV gridview 的按键事件响应巧变 事件分发机制...
  5. 谷歌搜索将于 2019 年年底停止索引任何 Flash 内容
  6. PHP 开发邀请功能,使用 larainvite 为 Laravel 5.3 应用添加邀请注册功能
  7. 云服务器 ECS 搭建WordPress网站:备案
  8. 为什么做的报表领导不满意,如何提升报表的价值?
  9. EMNLP21' | 细粒度情感分析新突破 —— 通过有监督对比学习方法学习隐式情感...
  10. 区块链 分片sharding 网络分片 交易分片 状态分片 是什么
  11. ue编辑器绿色免安装版
  12. Metasploit中meterpreter里cmd乱码解决办法
  13. 淮阴工学院计算机硕士生导师,硕士生导师概况
  14. Scheme语言基础之数据类型
  15. .Net培训班课程体系
  16. 大数据技术方面需要哪些支持
  17. 威联通nas怎么更换大硬盘_QNAP 篇一:记一次换硬盘引发的折腾
  18. 为什么现在很多人在用影刀,影刀突然火起来了?
  19. linux登录pg数据库命令,PostgreSQL数据库pg_dump命令行不输入密码的方法
  20. arcgis api for javascript4.18加载天地图服务,并且加载自己的发布的动态地图服务

热门文章

  1. Mapbox 地图SDK极速集成指导
  2. 编写一键备份MYSQL数据库脚本; 一键Nginx虚拟主机添加、删除脚本;
  3. 驱动直流电机三相全控桥整流电路
  4. adb shell input text 中文输入方法
  5. Kotlin开发activity跳转失败
  6. C# 打印Label的两种方式及实现
  7. 服务器系统可以安装ps吗,可以在云服务器安装ps么
  8. python实现txt文件批量格式互转
  9. 无动力游乐设施的优势
  10. thinkpadE485做java_ThinkPad E485笔记本安装win10系统操作教程