嵌入式Linux系统编程 — 5.5 sleep、usleep和nanosleep系统休眠函数

目录

1 为什么需要休眠

2 sleep、usleep和nanosleep函数

2.1 sleep函数

2.2 usleep函数

2.3 nanosleep函数

3 示例程序


1 为什么需要休眠

有时需要将进程暂停或休眠一段时间, 进入休眠状态之后,程序将暂停运行,直到休眠结束。
以下是一些常见的休眠场景和作用:

  • 避免过载:在高负载或密集计算任务中,程序可能需要定期休眠,以避免长时间占用CPU,给系统其他部分留出处理时间。

  • 定时任务:在需要执行定时任务的场景中,休眠可以用于实现简单的时间调度。

  • 错误恢复:在遇到错误或异常时,程序可能会选择休眠一段时间,然后重试操作,这可以作为简单的错误恢复机制。

  • 节能:在某些嵌入式系统或移动设备上,休眠可以用于节能,通过减少CPU的活动来降低功耗。

在Linux系统中,实现休眠的常用函数包括:

  • sleep():基于秒的休眠。
  • usleep():基于微秒的休眠(1微秒 = 10^-6秒)。
  • nanosleep():基于纳秒的休眠(1纳秒 = 10^-9秒),提供了更精细的控制。

2 sleep、usleep和nanosleep函数

2.1 sleep函数

sleep函数使调用进程休眠指定的秒数。

#include <unistd.h>unsigned int sleep(unsigned int seconds);
  • seconds:要休眠的秒数。
  • 返回值: 如果休眠时长为参数 seconds 所指定的秒数,则返回 0;若被信号中断则返回剩余的秒数。

2.2 usleep函数

usleep函数使调用进程休眠指定的微秒数。

#include <unistd.h>int usleep(useconds_t usec)
  • 参数:usec - 要休眠的微秒数。
  • 返回值: 成功返回 0;失败返回-1,并设置 errno。
     

2.3 nanosleep函数

nanosleep函数使调用进程休眠指定的纳秒数。

#include <time.h>int nanosleep(const struct timespec *req, struct timespec *rem);
  • req - 指向 timespec 结构的指针,该结构指定要休眠的时间。
  • rem - 指向 timespec 结构的指针,用于存储未完成的剩余时间(如果函数被中断)。
  • 返回值: 在成功休眠达到请求的时间间隔后, nanosleep()返回 0; 如果中途被信号中断或遇到错误,则返回-1, 并将剩余时间记录在参数 rem 指向的 struct timespec 结构体变量中(参数 rem 不为 NULL 的情况下,如果为 NULL 表示不接收剩余时间),还会设置 errno 标识错误类型。

3 示例程序

示例程序使用 sleep()usleep()nanosleep() 函数演示了当这些函数因信号中断时如何处理剩余的休眠时间。

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>int main() 
{// 使用 sleep() 函数休眠 2 秒printf("使用 sleep() 休眠 2 秒...\n");unsigned int seconds = 2;unsigned int remaining_seconds = sleep(seconds);if (remaining_seconds == 0) {printf("sleep() 正常结束。\n");} else {printf("sleep() 被中断,剩余休眠时间:%u 秒。\n", remaining_seconds);}// 使用 usleep() 函数休眠 1000 微秒printf("使用 usleep() 休眠 1000 微秒...\n");unsigned long usecs = 1000;int result = usleep(usecs);if (result == 0) {printf("usleep() 正常结束。\n");} else {printf("usleep() 被中断,错误码:%d。\n", errno);}// 使用 nanosleep() 函数休眠 100 毫秒printf("使用 nanosleep() 休眠 100 毫秒...\n");struct timespec req, rem;req.tv_sec = 0;req.tv_nsec = 100000000; // 100 毫秒while (nanosleep(&req, &rem) == -1) {if (errno == EINTR) {// 如果 nanosleep 被中断,更新剩余时间并重试req = rem;} else {perror("nanosleep 遇到错误");break;}}printf("nanosleep() 正常结束。\n");return 0;
}

运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Is ChatGPT a Good Personality Recognizer? A Preliminary Study?

ChatGPT是一个很好的人格识别者吗&#xff1f;初步调研 摘要1 介绍2 背景和相关工作3 实验3.1 数据集3.2 提示策略3.3 基线3.4 评估指标3.5 实现细节3.6 Overall Performance (RQ1)3.7 ChatGPT在人格识别上的公平性 (RQ2)3.8 ChatGPT对下游任务的人格识别能力&#xff08;RQ3&a…

javaEE——Servlet

1.web开发概述 所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互 2.java后端开发环境搭建 web后端(javaEE)程序需要运行在服务器中的&#xff0c;这样前端才可以访问得到 3.服务器是什么&#xff1f; ①服务器就是一款软件&#xff0c;可以向其发送请求&#…

如何根据两个关键字查询报错日志的位置

要根据两个关键字查询报错日志的位置&#xff0c;在Linux中&#xff0c;你可以使用grep命令结合正则表达式&#xff08;regex&#xff09;来实现。grep命令允许你在文件中搜索匹配特定模式的行。 假设你有两个关键字“keyword1”和“keyword2”&#xff0c;并且你想找到同时包…

教学常用内容

容器 #include<bits/stdc.h> #define fi first #define se second #define pb push_back #define PII pair<int,int > #define int long long #define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);using namespace std;const int N 1e610;vec…

深入解析HDFS:定义、架构、原理、应用场景及常用命令

引言 Hadoop分布式文件系统&#xff08;HDFS&#xff0c;Hadoop Distributed File System&#xff09;是Hadoop框架的核心组件之一&#xff0c;它提供了高可靠性、高可用性和高吞吐量的大规模数据存储和管理能力。本文将从HDFS的定义、架构、工作原理、应用场景以及常用…

【UML用户指南】-24-对高级行为建模-进程和线程

目录 1、概念 2、主动类 3、通信 4、同步 5、常用建模技术 5.1、对多控制流建模 5.2、对进程间通信建模 在UML中&#xff0c;可以将每一个独立的控制流建模为一个主动对象&#xff0c;它代表一个能够启动控制活动的进程或线程。 进程是一个能与其他进程并发执行的重量级…

2024新版大屏互动微信上墙源码大屏互动神器年会婚庆微现场3D签到

2024年大屏幕互动源码动态背景图和配乐素材搭建教程 php宝塔搭建部署活动现场大屏幕互动系统php源码&#xff0c;可以用来构建具有互动功能的大屏幕系统&#xff0c;为活动现场提供各种互动体验。 修复版的系统源码在原有功能的基础上&#xff0c;增加了更加完善的用户体验和稳…

【python学习】如何在一个python文件中调用另一个python文件的函数

在Python中&#xff0c;你可以通过import语句来调用另一个Python文件中的函数。假设你有两个Python文件&#xff1a;main.py 和 helper.py&#xff0c;并且你想要在main.py中调用helper.py中的函数。 首先&#xff0c;确保helper.py文件中有一个你可以调用的函数。例如&#x…

002-关于Geogebra软件的介绍及与MatLab的区别

为什么要学Geogebra&#xff1f; 因为和MatLab的科学计算相比&#xff0c;GeoGebra重点突出教学展示&#xff0c;对于教师、学生人群来讲再合适不过了&#xff0c;尤其是可以融入到PPT里边呈现交互式动画&#xff0c;想想听众的表情&#xff01;这不就弥补了看到PPT播放数学公…

GIT 基于master分支创建hotfix分支的操作

基于master分支创建hotfix分支的操作通常遵循以下步骤&#xff1a; 切换到master分支&#xff1a; 首先&#xff0c;确保你的工作区是最新的&#xff0c;并且你在master分支上。如果不在master分支&#xff0c;你需要先切换过去。 Bash git checkout master 拉取最新的master…

科研图片清晰化

科研图片清晰化方法包括图像类型与处理工具的选择、图像色彩模式设置、图像储存与导出格式等。在科研领域&#xff0c;尤其是在撰写和发表学术论文的过程中&#xff0c;清晰的科研图片是展示研究结果的重要部分。它能够帮助审稿人和读者更好地理解研究内容和结论&#xff0c;增…

STM32第十二课:ADC检测烟雾浓度(MQ2)

文章目录 需求一、MQ-2 气体传感器特点应用电路及引脚 二、实现流程1.开时钟&#xff0c;分频&#xff0c;配IO2.配置ADC的工作模式3.配置通道4.复位&#xff0c;AD校准5.数值的获取 需求实现总结 需求 使用ADC将MQ2模块检测到的烟雾浓度模拟量转化为数字量。 最后&#xff0c…

2.00004 优化器执行计划生成的流程是怎么样的?

文章目录 整体架构关键结构体PlannerInfo (pathnodes.h:195)PlannerGlobal (pathnodes.h:95)函数栈关键函数pg_plan_query (postgres.c:885)planner (planner.c:274)standard_planner (planner.c:287)subquery_planner (planner.c:628)整体架构 关键结构体 PlannerInfo (pathn…

Servlet_Web小结

1.web开发概述 什么是服务器&#xff1f; 解释一&#xff1a;服务器就是一款软件,可以向其发送请求,服务器会做出一个响应. 可以在服务器中部署文件,让他人访问 解释二&#xff1a;也可以把运行服务器软件的计算机也可以称为服务器。 web开发&#xff1a; 指的是从网页中向后…

MySQL-SQL优化Explain命令以及参数详解

前言 在MySQL优化的众多手段中&#xff0c;EXPLAIN命令扮演着至关重要的角色。它是数据库管理员和开发者手中的利器&#xff0c;用于分析SQL查询的执行计划。通过执行EXPLAIN&#xff0c;MySQL会提供一份详细的查询执行计划报告&#xff0c;这份报告揭示了查询将如何执行&…

【GIT】GIT服务器迁移了之后如何重新映射

最近我的一个GIT服务器镜像迁移了&#xff0c;伴随着ip地址也发生了变化。 经过实践&#xff0c;发现执行一下三步即可解决&#xff1a; 1、进入客户端版本管理后的源码文件夹&#xff1b; 2、执行&#xff1a; git remote -v 如果目录不对会提示&#xff1a; fatal: not…

2024年6月个人工作生活总结

title: 2024年6月个人工作生活总结 urlname: code-for-2024-06 tags: 代码积累知识总结 categories:我的程序代码 date: 2024-06-30 00:00:00 photos:gallery/tech/c2.jpg 本文为 2024年6月工作生活总结。 研发编码 编码和注释 因某些需要&#xff0c;重拾了2019年的工程代码…

Scala 循环

Scala 循环 Scala,作为一种多范式的编程语言,提供了丰富的方式来处理循环和迭代。在Scala中,除了传统的for和while循环外,还有更高级的函数式编程特性,如集合操作和高阶函数,这些都可以用来实现循环和迭代的任务。本文将详细介绍Scala中的循环机制,包括基本语法、高级用…

JUC工具类: Semaphore详解

Semaphore底层是基于AbstractQueuedSynchronizer来实现的。Semaphore称为计数信号量&#xff0c;它允许n个任务同时访问某个资源&#xff0c;可以将信号量看做是在向外分发使用资源的许可证&#xff0c;只有成功获取许可证&#xff0c;才能使用资源。立刀旁 目录 # 带着BAT大厂…

EDA 虚拟机 Synopsys Sentaurus TCAD 2016.03 下载

下载地址&#xff08;制作不易&#xff0c;下载使用需付费&#xff0c;不能接受的请勿下载&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1baw0IhmnFOKVkJMI3zkD_A?pwdcheo 提取码&#xff1a;cheo