当前位置: 首页 > news >正文

[OS] 终端控制(Terminal Control) 暂停执行线程(Suspend Executing Thread)

7. 终端控制(Terminal Control)

在终端中打印信息时,我们可以使用 ANSI 转义序列来控制光标的位置、清除屏幕等操作。\033 是转义字符,用于引导 ANSI 控制码来控制终端显示。可以将它理解为“命令前缀”,后面跟着具体的指令代码来控制终端的行为。

7.1 示例代码:使用 \033 控制终端光标和屏幕

以下是一个示例代码,展示如何使用 \033 来清屏、控制光标位置,并在屏幕上打印信息。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main(int argc, char *argv[]) {int isStop;// 清屏printf("\033[2J");// 在不同位置打印信息for (isStop = 1; isStop < 11; isStop++) {// 设置光标位置:移动到 (11 - isStop) 行的第 10 列printf("\033[%d;10H", (11 - isStop));printf("Printing within loop %d!\n", isStop);sleep(1);  // 等待 1 秒}// 移动光标到左上角并清除屏幕printf("\033[H\033[2J");return 0;
}
代码解释
  1. 清除屏幕

    • printf("\033[2J");
      • \033[2J:清除整个屏幕。\033 是转义字符,[2J 是清除屏幕的命令。
  2. 设置光标位置并打印信息

    • printf("\033[%d;10H", (11 - isStop));
      • \033[%d;10H:将光标移动到指定的位置。
      • %d 表示行号,这里 (11 - isStop) 是动态计算行号,10 是列号。这样可以让打印的信息从屏幕的第 11 行开始依次向上打印。
  3. 等待

    • sleep(1);
      • 通过 sleep(1) 使程序在每次循环时等待 1 秒,这样每次打印可以有明显的时间间隔。
  4. 结束时再次清屏

    • printf("\033[H\033[2J");
      • \033[H:将光标移动到屏幕的左上角(第 1 行,第 1 列)。
      • \033[2J:清除整个屏幕。

输出效果

当运行这个程序时,你会看到以下行为:

  1. 程序开始时,屏幕会被清除。
  2. 在每次循环中,程序会将光标定位到一个新的位置(行号逐渐减小,但列号保持不变),并打印信息。例如:

    Printing within loop 1! Printing within loop 2! ...

    信息每次会从屏幕的不同位置打印,每次向上移动一行。
  3. 每次打印后会等待 1 秒,这样可以看到打印过程是逐行向上的。
  4. 循环结束后,屏幕会再次被清除。

\033 控制序列的常用命令

  • \033[H:将光标移动到屏幕左上角(第 1 行,第 1 列)。
  • \033[2J:清除屏幕内容。
  • \033[n;mf:设置文本颜色,其中 n 是颜色代码。
    • 例如:\033[31m 将文本设置为红色。
  • \033[nA:将光标向上移动 n 行。
  • \033[nB:将光标向下移动 n 行。
  • \033[nC:将光标向右移动 n 列。
  • \033[nD:将光标向左移动 n 列。

通俗解释

可以把使用 \033 控制终端显示比作是写黑板时控制粉笔的位置。\033 是控制粉笔移动的指令,通过指定行和列的坐标来移动粉笔,让它在指定的位置书写。

在终端应用中,这种控制非常有用,例如:

  • 实现命令行界面中的进度条
  • 更新输出的状态信息而不清屏。
  • 实现动态显示的内容,比如一个简单的文本游戏或用户交互的应用程序。

为什么需要这些控制字符?

  • 动态输出:使用控制字符可以实现屏幕上信息的动态更新,而不是每次都打印新的内容。这对于游戏、实时监控程序等非常有用。
  • 改善用户体验:可以避免在终端中打印过多信息,让输出更加有条理。通过控制光标位置,可以实现更直观的输出形式,例如进度条、状态更新等。

示例应用场景

  • 游戏:像贪吃蛇这样的终端游戏,可以使用光标控制来实现蛇的移动,而不是不断刷新整个屏幕。
  • 实时监控:在显示一些实时数据(如 CPU 使用率、内存占用等)时,可以直接在原来的位置更新数据,而不是一行一行地追加输出。
  • 命令行界面:例如用于选择菜单选项、进度指示器等。

总结

  • \033 是 ANSI 控制序列的起始符号,用于向终端发送控制命令。
  • 通过使用 控制字符,可以更好地控制终端上的光标位置、文本颜色、清屏等功能,从而实现更复杂的显示效果。
  • 使用这些控制字符可以使终端程序更加交互和友好,在开发游戏、监控工具、动态显示工具时非常有用。

8. 暂停执行线程(Suspend Executing Thread)

usleep(useconds_t usec) 函数用于暂停线程的执行,单位是微秒。它可以让线程暂停指定的时间,然后再继续执行。这种功能非常有用,例如控制任务的执行节奏或使线程在等待某些条件时休眠。

  • usleep():用于暂停调用线程指定的微秒数(1 秒 = 1,000,000 微秒)。
  • sleep():用于暂停线程指定的秒数。
  • nanosleep():用于以纳秒精度指定休眠时间。适合需要更高精度的时间控制的场合。

8.1 示例代码:使用 usleep()sleep()

以下是一个简单的示例,展示如何使用 sleep()usleep() 来控制程序的执行。

示例代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>int main(int argc, char *argv[]) {// 使用 sleep() 函数暂停程序执行 5 秒printf("Sleep program for 5 seconds\n");sleep(5);// 使用 usleep() 函数暂停程序执行 1000000 微秒(即 1 秒)printf("Sleep program for 1000000 microseconds (1 second)\n");usleep(1000000);// 程序结束printf("Program finished\n");return 0;
}
代码解释
  1. sleep() 函数

    • sleep(5):使当前线程暂停 5 秒,然后继续执行后续代码。
    • 作用:在执行某些任务之前强制等待一定的时间,这对需要做定时延迟的操作非常有用。
  2. usleep() 函数

    • usleep(1000000):使当前线程暂停 1,000,000 微秒,即 1 秒。
    • 作用:提供比 sleep() 更高精度的延迟功能,可以精确到微秒级别。
    • 需要注意的是,usleep() 精度较高,但具体暂停时间可能会受到系统的活动和计时器粒度的影响,因此有可能比设定的时间稍长。
  3. 输出

    Sleep program for 5 seconds
    Sleep program for 1000000 microseconds (1 second)
    Program finished
    

    • 程序首先等待 5 秒,然后输出第二行信息,再等待 1 秒,最后输出结束信息。
usleep()sleep()nanosleep() 的区别
  1. sleep(seconds)

    • 暂停线程指定的秒数。
    • 适用场合:适合需要较长时间延迟(例如秒级别)的场合。
  2. usleep(useconds_t usec)

    • 暂停线程指定的微秒数。
    • 适用场合:适合需要比 sleep() 更精细的延迟控制,比如毫秒级的等待。
  3. nanosleep()

    • 允许用户以纳秒精度指定休眠时间,适合需要更高精度的时间控制。
    • 它的函数声明是:
      int nanosleep(const struct timespec *req, struct timespec *rem);
      

    • 参数
      • req:指定需要暂停的时间,包含秒和纳秒。
      • rem:如果休眠被中断,则返回剩余的休眠时间。

usleep() 的使用场景

  1. 多线程中的延迟

    • 在多线程编程中,线程之间可能需要一些延迟来防止资源竞争,usleep() 可以让线程在执行任务之间休眠一些时间,从而降低 CPU 占用并减少资源争用。
  2. 游戏循环和动画

    • 在简单的游戏开发中,可以使用 usleep() 来控制帧率,确保每一帧之间有一个固定的时间间隔,从而实现平滑的动画效果。
  3. 定时任务

    • 在编写定时任务时,可以使用 usleep()sleep() 来定时地执行某些操作,例如每隔 1 秒采集一次传感器数据。

代码应用场景

  • 在很多应用场合中,线程之间的任务执行需要有一个节奏,不是所有的任务都需要立即连续地执行。例如,在对某个传感器进行定时读取时,可能每隔 500 毫秒读取一次数据,使用 usleep(500000) 就可以方便地实现这样的功能。

  • 在多线程应用中,usleep() 可以用来暂时暂停当前线程的执行,以便其他线程有机会运行。例如,一个线程在等待某些资源可用时可以通过 usleep() 暂时休眠,以避免反复轮询导致 CPU 资源的浪费。

注意事项

  1. 精度限制

    • 尽管 usleep() 提供微秒级的控制,但具体的延迟时间可能会因系统负载等原因而稍长。对于需要非常精确的计时任务,可能需要更复杂的同步机制。
  2. 系统调用影响

    • 在一些系统中,调用 usleep() 可能会受到系统定时器的粒度影响。如果需要非常精确的延迟控制,建议使用 nanosleep()

nanosleep() 示例

以下是一个使用 nanosleep() 的简单示例,用于精确控制线程暂停的时间。

#include <stdio.h>
#include <time.h>int main() {struct timespec ts;ts.tv_sec = 0;          // 秒数部分ts.tv_nsec = 500000000; // 纳秒部分(0.5 秒)printf("Sleeping for 0.5 seconds...\n");nanosleep(&ts, NULL);printf("Wake up after 0.5 seconds\n");return 0;
}

总结

  • sleep()usleep()nanosleep() 都是用于暂停线程执行的函数,适用于不同精度的时间控制。
  • usleep() 提供微秒级的延迟控制,在多线程和定时任务中非常有用。
  • nanosleep() 提供纳秒级的控制,适合需要高精度延迟的任务。
  • 这些函数在需要控制任务执行节奏、避免资源争用或实现实时响应时非常有用。

 

相关文章:

[OS] 终端控制(Terminal Control) 暂停执行线程(Suspend Executing Thread)

7. 终端控制&#xff08;Terminal Control&#xff09; 在终端中打印信息时&#xff0c;我们可以使用 ANSI 转义序列来控制光标的位置、清除屏幕等操作。\033 是转义字符&#xff0c;用于引导 ANSI 控制码来控制终端显示。可以将它理解为“命令前缀”&#xff0c;后面跟着具体…...

水陆两栖车应对应急事件发挥的作用_鼎跃安全

随着气候变化&#xff0c;城市内涝等问题日益严重。为了应对可能出现的洪水灾害&#xff0c;许多城市开始将水陆两栖车纳入应急救援装备体系。在暴雨引发城市积水时&#xff0c;水陆两栖车可以作为一种高效的救援和运输工具&#xff0c;及时疏散被困群众&#xff0c;运送应急物…...

CI/CD 流水线系统-开源框架Tekton

文章目录 CI/CD 流水线系统-开源框架Tekton什么是TektonTekton优点Tekton 组件介绍Tekton 概念术语 CI/CD 流水线系统-开源框架Tekton 什么是Tekton 官网&#xff1a;https://tekton.dev/ Tekton 是一个强大、灵活的构建 CI/CD 流水线系统的开源框架,允许开发者构建、测试和…...

Spring MVC(下)

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多JavaEE知识 目录 1.响应 1.1 返回静态页面 1.2 返回数据ResponseBody 1.3 返回HTML代码⽚段 1.4 返回JSON 1.5 设置状态码 1.6 设置Header 2 . …...

开发涉及的安全规范整理

#1024程序员节&#xff5c;征文# 文章目录 前言安全场景与措施API调用方式鉴权参数校验日志打印数据保存加密 总结 前言 这篇文章我们来整理下写代码和方案设计中的安全规范问题&#xff0c;内容偏服务端&#xff0c;即使是入门的新人&#xff0c;如果你对安全有所了解会让成熟…...

驱动开发系列26 - Linux Graphics 调试 mesa 的 glDrawArrays (二)

目录 一:概述 二:Gallium3D 的工作流程 三:tc_draw_vbo 与 tc_call_draw_single 的关系: 四:tc_draw_vbo 与 tc_call_draw_single 的具体执行流程: 五:mesa中线程池设计介绍: 六:总结: 一:概述 众所周知,Mesa 的 Gallium3D 是一个图形驱动框架,它将图形管线…...

laya-spine动画的使用

laya2和laya3的spine动画在使用过程中并无太大区别&#xff0c;这里以laya3为例。 转换 首先将做好的spine动画按jison格式导出&#xff0c;导出完之后的文件应包括图集、图片和json类型的3个文件。然后再用laya的骨骼动画转换工具转换成laya内置的模式&#xff0c;转换后的文…...

Vue项目实战-新能源汽车可视化(一)(持续更新中)

一.项目代码 1.App.vue <template><!-- 模板--><div id"wrapper"><div style"width: 100%"><el-tabs v-model"activeName" id"tabs"> <!-- 标签栏里包含了三个标签面板&#xff0c;分别是研发与维…...

百度SEO前10关键词排名波动跟用户行为反馈有很大关系

大家好&#xff0c;我是林汉文&#xff08;谷歌SEO专家&#xff09;&#xff0c;在百度SEO优化中&#xff0c;网站的排名并非一成不变&#xff0c;尤其是前10名的位置&#xff0c;更是动态变化。很多站长可能会发现&#xff0c;有时明明内容质量不错&#xff0c;外链也稳定&…...

基于微信小程序的电影交流平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

Java实现 itext PDF文件打印水印(文字和图片水印)

itext PDF文件打印水印 前言&#xff1a;公司有个需求&#xff0c;打印的合同模板要加上水印&#xff0c;但是由于itext版本问题&#xff0c;网上千篇一律的方法基本都没办法有效使用&#xff0c;然后自己琢磨下&#xff0c;记录下实现水印的功能的笔记。多页上都加上水印&…...

面经之一:Synchronized与ReentrantLock区别

Synchronized与ReentrantLock是Java中用于实现线程同步的两种主要机制&#xff0c;它们各有特点和适用场景。以下是它们的主要区别&#xff1a; 实现方式&#xff1a; Synchronized&#xff1a;是Java语言内置的关键字&#xff0c;通过JVM层面的监视器&#xff08;Monitor&…...

论文速读:面向单阶段跨域检测的域自适应YOLO(ACML2021)

原文标题&#xff1a;Domain Adaptive YOLO for One-Stage Cross-Domain Detection 中文标题&#xff1a;面向单阶段跨域检测的域自适应YOLO 1、Abstract 域转移是目标检测器在实际应用中推广的主要挑战。两级检测器的域自适应新兴技术有助于解决这个问题。然而&#xff0c;两…...

React中在map遍历中,给虚拟标签(<></>)加key

有时我们可能会需要在遍历时使用虚拟标签包裹内容&#xff0c;而不使用实际标签 &#xff0c;这种时候会有一个问题&#xff0c;就是虚拟标签无法加key&#xff0c;这样控制台会一直有警告。 {[1,2,3,4].map(v><><div></div><div></div><…...

大数据生态守护:Hadoop的深度保护策略

PART 1 从Hadoop运行原理透视数据保护需求 1、Hadoop的定义与范畴 Hadoop&#xff0c;狭义而言&#xff0c;是一个专为大数据设计的分布式存储与计算平台&#xff0c;其核心组件包括HDFS&#xff08;Hadoop分布式文件系统&#xff09;、MapReduce&#xff08;分布式计算框架&a…...

代码欣赏之:此题易错在 a+b 非要写成 a-fabs(b).因为这样就成了浮点值了,得不到准确数

代码欣赏之&#xff1a;此题易错在 ab 非要写成 a-fabs(b).因为这样就成了浮点值了&#xff0c;得不到准确数 7-23 小孩子才做选择&#xff0c;大人全都要 #include<stdio.h> #include<math.h> int main() {int a,b;scanf("%d %d",&a,&b);if(a&…...

ECharts饼图-环形图,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个饼图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供详…...

arcgis js 怎么加载geoserver发布的wms服务

arcgis js api加载wms服务&#xff0c;官方的参考样例&#xff1a; WMSLayer | Sample Code | ArcGIS Maps SDK for JavaScript 4.30 | Esri Developer 按照官方样例加载比较奇怪&#xff0c;我们平常习惯用url或者json的方式加载&#xff0c;稍微改一下就行&#xff0c;如下…...

前端_006_Vue2

文章目录 vue常用属性生命周期模版语法自定义组件全局注册 单文件组件路由 本文全部参考Vue2 简介&#xff1a;Vue是一个数据响应式&#xff0c;MVVM模型的JS框架 官网&#xff1a;https://v2.cn.vuejs.org/v2/guide/ API&#xff1a;https://v2.cn.vuejs.org/v2/api/#method…...

论多端数据互通网游的架构评估

摘要 在2023年&#xff0c;笔者参与了一款多端数据互通网络游戏的架构评估工作&#xff0c;并担任评估团队的核心成员。该游戏支持PC、移动设备和游戏机等多种终端&#xff0c;实现了数据的实时互通。本文通过该项目的评估实践&#xff0c;探讨了多端数据互通网游架构评估的关…...

网页HTML编写练习:华语榜中榜

网页效果 HTML代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice…...

C++ 编程基础:深入理解 `pair`(键值对) 和 `unordered_map`(无序映射)

C 编程基础&#xff1a;深入理解 pair&#xff08;键值对&#xff09; 和 unordered_map&#xff08;无序映射&#xff09; 在 C 标准库中&#xff0c;pair&#xff08;键值对&#xff09;和 unordered_map&#xff08;无序映射&#xff09;是两种常用的数据结构&#xff0c;它…...

高德动态地图

1.搭建页面结构 <div class"dataAllBorder02" style"position: relative; overflow: hidden;"><div class"map_title_box" style"height: 6%"><div class"map_title_innerbox"><div class"map_t…...

springboot集成camunda学习与使用

springboot集成camunda学习与使用.md 0、前言一、Spring Boot 集成camunda流程引擎1.新建全新的springboot工程2.添加pom.xml依赖3.启动Spring Boot工程4.切换成mysql数据库5.设计并部署一个BPMN流程6.camunda流程引擎测试6.1 通过camunda web控制台测试6.2 通过camunda rest接…...

微服务架构学习笔记

#1024程序员节|征文# 微服务架构作为现代软件开发中的热门技术架构&#xff0c;因其灵活性和可扩展性&#xff0c;逐渐成为许多企业系统设计的首选。以下是关于微服务的一些学习笔记&#xff0c;涵盖微服务的核心概念、优缺点、设计原则以及常用工具等方面。 1. 微服务是什么&…...

代码优化之简化if臃肿的判断条件

简化if判断条件 方法1&#xff1a; #include <iostream> #include <vector> #include <functional>// 封装参数的结构体 struct ConditionParams {int facenum;double zoomRatio;int iso;double facelv;int face_w;double qualityScore;int xx;int yy; };//…...

【OpenAI】第六节(语音生成与语音识别技术)从 ChatGPT 到 Whisper 的全方位指南

前言 在人工智能的浪潮中&#xff0c;语音识别技术正逐渐成为我们日常生活中不可或缺的一部分。随着 OpenAI 的 Whisper 模型的推出&#xff0c;语音转文本的过程变得前所未有的简单和高效。无论是从 YouTube 视频中提取信息&#xff0c;还是将播客内容转化为文本&#xff0c;…...

Docker 下备份恢复oracle

1.docker导出容器镜像 ##docker save -o 导出后的镜像名称.tar 容器名称|镜像id docker save -o oracle_11g.tar 3fa112fd3642 2.下载镜像上传镜像略 3.加载镜像 ##docker load -i <archive_file> docker load -i oracle11g11201.tar 4.添加版本号…...

oneplus3t-android_framework

0.确认oneplus6 root正常 oneplus6 root材料 oneplus6手机恢复出厂设置 &#xff0c; 或者 线刷 enchilada_22_K.52_210716_repack--HOS-10.0.11.zip &#xff1a; https://gitee.com/OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip OnePlus6Hydrogen_22…...

偷懒总结篇|贪心算法|动态规划|单调栈|图论

由于这周来不及了&#xff0c;先过一遍后面的思路&#xff0c;具体实现等下周再开始详细写。 贪心算法 这个图非常好 122.买卖股票的最佳时机 II(妙&#xff0c;拆分利润) 把利润分解为每天为单位的维度&#xff0c;需要收集每天的正利润就可以&#xff0c;收集正利润的区间…...

商洛市城乡建设局网站/榆林百度seo

ba 等价于 bba && 逻辑与 都真才真 一假为假 || 逻辑或 都假才假 一真为真 &#xff01;逻辑非 取反 C是面向对象的语言&#xff0c;C是面向过程的语言。 C可以把数据封装在对象里&#xff0c;而C语言里没有对象一说&#xff0c;C语言常把数据封装在一个又一个的函数…...

手机做网站对比路由器做网站/微信crm系统

网络提示错误720的解决方法之一参考文章&#xff1a; &#xff08;1&#xff09;网络提示错误720的解决方法之一 &#xff08;2&#xff09;https://www.cnblogs.com/lemon1991/p/5046868.html 备忘一下。...

dedecms手机网站制作/北京网站优化服务

分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术&#xff0c;将多个计算机联合起来作为攻击平台&#xff0c;对一个或多个目标发动DoS攻击&#xff0c;从而成倍地提高拒绝服务攻击的威力。通常&#xff0c;攻击者使用一个偷窃帐号将DDoS主控程…...

做摄影网站的目的是什么意思/快速搭建网站的工具

一.描述 均值漂移聚类是另一种基于质心的算法&#xff0c;旨在发现一个样本密度平滑的blobs。它的工作原理与K均值聚类十分相似&#xff0c;但也存在一些明显差异。首先&#xff0c;均值漂移聚类不需要像k均值聚类那样指定集群数量&#xff1b;其次&#xff0c;均值漂移聚类会…...

企业手机网站建设特色/参考网是合法网站吗?

这个问题在论坛上的提问比较频繁的&#xff0c;这里总结一下几种方法&#xff0c;希望对没用过的朋友有所帮助^_^。高手就不用看了 方法一&#xff1a; 1#region 2 /**//// <summary> 3 /// 功能描述&#xff1a;遍历Asp.net窗体上所有的控件 4 //…...

建设网站最重要的是什么/网站域名查询官网

刚开始我们先看一下它的定义&#xff1a; .bind( eventType [, eventData], handler(eventObject)) .Bind()方法的主要功能是在向它绑定的对象上面提供一些事件方法的行为。期中它的三个参数的意义分别如下&#xff1a; eventType是一个字符串类型的事件类型&#xff0c;就是你…...