我们一般接触比较多的就是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;
}
可以看见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;
}
可以看见5s会有一次显示。文章来源:https://www.toymoban.com/news/detail-478175.html
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);
}
可以看见我们函数主要是根据usleep函数实现的,仿照这来写的函数程序。
其实说实话我们其实直接可以利用微妙级函数直接实现毫秒级的延迟就行。文章来源地址https://www.toymoban.com/news/detail-478175.html
到了这里,关于C语言中usleep与nanosleep函数讲解以及毫秒级休眠实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!