飞凌嵌入式ElfBoard-系统信息与资源之休眠

在编写应用程序时多多少少会遇到需要程序等待一会,再执行下面的程序,这时候就需要延时函数来实现这个功能,本节就来介绍延时函数的使用。

一、sleep

用于使程序暂停执行一段时间,通常是以秒为单位。

1.头文件

#include <unistd.h>

2.函数原型

unsigned int sleep(unsigned int seconds);

3.参数

seconds: 需要暂停的时间,以秒为单位。该参数是一个无符号整数,表示希望程序停止执行的时间长度。

4.返回值

成功:返回值为 0,表示暂停的时间已经结束。

被中断:如果在暂停期间接收到信号,sleep() 函数可能会被中断,返回未用的剩余秒数,即返回值可能小于 seconds。

二、usleep

用于使程序暂停执行一段时间,通常是以微秒为单位。

1.头文件

#include <unistd.h>

2.函数原型

int usleep(useconds_t microseconds);

3.参数

microseconds: 需要暂停的时间,以微秒(百万分之一秒)为单位。该参数类型为 useconds_t,通常是无符号整数。

4.返回值

成功: 返回 0,表示暂停成功。

失败: 返回 -1,并将 errno 设置为相应的错误代码。

三、nanosleep

用于要求精确控制时间间隔的场景。它的主要特点是可以让程序暂停指定的时间,并且可以设置精确到纳秒级的时间。

1.头文件

#include <time.h>

2.函数原型

int nanosleep(const struct timespec *req, struct timespec *rem);

3.参数

req: 指向一个 struct timespec 结构的指针,该结构指定了希望暂停的时间。

struct timespec 的定义如下:

struct timespec {

time_t tv_sec; // 秒数

long tv_nsec; // 纳秒数

};

4.返回值

成功:返回 0,表示暂停成功。

失败:返回 -1,并将 errno 设置为相应的错误代码(如 EINTR 表示中断)。

5.示例:(使用不同函数分别延时1秒)

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #include <stdio.h> #include <unistd.h> #include <time.h> #include <sys/time.h> void print_current_time(const char *function_name, long delay) { struct timeval start, end; long elapsed; // 获取开始时间 gettimeofday(&start, NULL); // 打印函数名称和延迟时间 printf("当前测试的函数: %s\n", function_name); printf("延迟时间: %ld 微秒\n", delay); // 根据不同的函数调用相应的延迟函数 if (function_name == "sleep") { sleep(delay / 1000000); // 转换微秒为秒 } else if (function_name == "usleep") { usleep(delay); // 直接使用微秒 } else if (function_name == "nanosleep") { struct timespec req; req.tv_sec = delay / 1000000; // 秒部分 req.tv_nsec = (delay % 1000000) * 1000; // 纳秒部分 nanosleep(&req, NULL); } // 获取结束时间 gettimeofday(&end, NULL); // 计算和打印耗时 elapsed = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec); printf("开始时间: %ld.%06ld\n", start.tv_sec, start.tv_usec); printf("结束时间: %ld.%06ld\n", end.tv_sec, end.tv_usec); printf("实际延迟时间: %ld 微秒\n", elapsed); printf("------------------------------------\n"); } int main() { // 延迟时间设为 1 秒(1000000 微秒) long delay_time = 1000000; print_current_time("sleep", delay_time); print_current_time("usleep", delay_time); print_current_time("nanosleep", delay_time); return 0; } |

6.查看测试结果

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 当前测试的函数: sleep 延迟时间: 1000000 微秒 开始时间: 1730949732.570708 结束时间: 1730949733.571225 实际延迟时间: 1000517 微秒 ------------------------------------ 当前测试的函数: usleep 延迟时间: 1000000 微秒 开始时间: 1730949733.571247 结束时间: 1730949734.571379 实际延迟时间: 1000132 微秒 ------------------------------------ 当前测试的函数: nanosleep 延迟时间: 1000000 微秒 开始时间: 1730949734.571402 结束时间: 1730949735.571949 实际延迟时间: 1000547 微秒 |

可以看到实际运行时间和设置时间是有一些误差的,这是因为系统运行、系统调用等原因都会影响实际的休眠效果。

相关推荐
wuminyu1 天前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
GreenTea1 天前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
Blockbuater_drug1 天前
FreeSASA: 开源 SASA 计算库,pip 一条命令替代 NACCESS
c语言·开源·sasa·freesasa·溶剂可及表面积·naccess·python api
Bode_20021 天前
多资源规划(含生产调度、库存管理及产能规划)的创新优化算法
算法·调度
Logic1011 天前
C语言/数据结构位运算题解:异或XOR找出蛋糕订单中的“VIP独特口味“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
土司大王1 天前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹1 天前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
言乐61 天前
Python加速器4跨境网络加速器
运维·服务器·开发语言·网络·python
土司大王1 天前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
金金计较.1 天前
Go语言-3
java·开发语言·golang