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

这篇具有很好参考价值的文章主要介绍了C语言中usleep与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 // 大概是1s

int 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;
}

C语言中usleep与nanosleep函数讲解以及毫秒级休眠实现
可以看见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 call
     nanosleep() which itself is a cancellation point we do not have
     to 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  //5s

int main(int argc, char *argv[])
{
	while(1)
	{
		usleep(s);
		printf("5 seconds passed...\n");
	}
	return 0;
}

C语言中usleep与nanosleep函数讲解以及毫秒级休眠实现
可以看见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 5000

void 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);
}

C语言中usleep与nanosleep函数讲解以及毫秒级休眠实现
可以看见我们函数主要是根据usleep函数实现的,仿照这来写的函数程序。
其实说实话我们其实直接可以利用微妙级函数直接实现毫秒级的延迟就行。文章来源地址https://www.toymoban.com/news/detail-478175.html


到了这里,关于C语言中usleep与nanosleep函数讲解以及毫秒级休眠实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言内存函数介绍以及实现

    目录 前言 一:内存拷贝函数 (1)memcpy( )函数 (2)memove( )函数 二:内存比较函数 三:内存设置函数 本文介绍的函数的函数声明都在头文件string.h中。 函数声明:void* memcpy(void* dest,const void* src,size_t num) 作用:把一片内存空间的字节拷贝到另一片内存空间。 函数参数的意义: ①dest指

    2024年02月01日
    浏览(29)
  • C语言字串函数、内存函数介绍以及模拟实现

        目录 前言 本期内容介绍: 一、字符串函数 strlen介绍 strlen 模拟实现(三种方式) 方法一:计数器法  方法二:递归法(不创建临时变量法) 方法三:指针-指针 strcpy介绍 strcpy模拟实现 ​编辑strcmp介绍 strcmp模拟实现 strcat介绍 strcat模拟实现 strncpy介绍 strncpy模拟实现 s

    2024年02月14日
    浏览(26)
  • 初阶算法(3):二分法的讲解与实现(C语言),以及二分不止光在有序数组中的应用

     第一章 初阶算法(1):通过简单的排序算法来认识时间复杂度  第二章 初阶算法(2):进行详细地介绍插入排序的细节和时间复杂度  第三章 初阶算法(3):二分法的讲解与实现,以及二分不止光在有序数组中的应用 目录 系列文章目录 前言 一、二分法的讲解与实现

    2024年02月14日
    浏览(30)
  • getStructuringElement函数以及开、闭、腐蚀、膨胀原理讲解

    cv2.getStructuringElement()函数的作用是返回一个结构元素(卷积核),具体解析如下: a取不同的参数会导致卷积核有不同的形状,a参数有三个: ①:MORPH_RECT(函数返回矩形卷积核) ②:MORPH_CROSS(函数返回十字形卷积核) ③:MORPH_ELLIPSE(函数返回椭圆形卷积核) b:用一个(x,y)的

    2024年01月16日
    浏览(27)
  • 【Socket】Linux下UDP Socket的基本流程以及connect、bind函数的使用(C语言实现)

    Socket的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”。 Socket通信主要有两个类型:TCP、UDP。 TCP通信,是一个有序的、可靠的、面向连接的通信方式。用数据流的方式传递信息。 UDP通信,是无连接的、不保证有序到达的、但具有较好的实时性、能够高速传输

    2024年02月13日
    浏览(27)
  • 【C语言】函数讲解(下)

    所属专栏:C语言 博主首页:初阳785 代码托管:chuyang785 感谢大家的支持,您的点赞和关注是对我最大的支持!!! 博主也会更加的努力,创作出更优质的博文!! 关注我,关注我,关注我,重要的事情说三遍!!!!!!!! 告诉编译器有一个函数叫什么,参数是什么,

    2024年02月02日
    浏览(26)
  • 第四讲—讲解GPIO_Write函数以及相关例程

    之前讲解了初学GPIO的几个函数,下面介绍又一个函数,此函数对所有端口进行操作 GPIO_Write函数,与上一篇里边讲解的其他函数相比,最大的特点是它可以对多个端口进行赋值操作。 先看函数定义: 第一个参数与之前一样,因为是对多个端口操作,我们以GPIOA的所有端口为例

    2024年02月16日
    浏览(26)
  • STM32延迟(休眠)函数delay/sleep

    参考 MSP432(Keil5)——3.delay延时驱动_keil5delay函数_大写的小写字母的博客-CSDN博客 亲手测试过, 好用。用while太愚蠢,而且不好控制。 下载链接 https://download.csdn.net/download/quantum7/87982408 delay.h delay.c

    2024年02月12日
    浏览(27)
  • 【C语言】文件的操作与文件函数的使用(详细讲解)

    前言:我们在学习C语言的时候会发现在编写一个程序的时候,数据是存在内存当中的,而当我们退出这个程序的时候会发现这个数据不复存在了,因此我们可以通过文件把数据记录下来,使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。 💖 博主CS

    2024年02月08日
    浏览(28)
  • C语言函数声明以及函数原型

    所谓声明(Declaration),就是告诉编译器我要使用这个函数; 函数声明的格式,是去掉函数定义中的函数体,并在最后加上分号; 也可以不写形参,只写数据类型: dataType  functionName( dataType1, dataType2 ... ); 函数声明给出了函数名、返回值类型、参数列表(重点是参数类型)等

    2024年02月01日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包