【Linux】实现倒计时、进度条、gdb

news2024/11/25 2:25:20

文章目录

  • 缓冲区
    • 1.概念
    • 2.作用
    • 3.刷新策略
    • 4.缓冲区位置
  • 实现倒计时
  • 实现进度条
  • Linux调试器----gdb

缓冲区

1.概念

缓冲区是计算机内存的一部分,用于暂时存储数据。它在数据传输过程中起到一个缓冲桥梁的作用,帮助协调数据传输的速度差异。缓冲区可以是磁盘缓存,网络传输中的数据缓存等。

2.作用

缓冲区的作用非常广泛和重要,主要体现在以下几个方面:

◉ 提升读写效率

当进程要进行文件读写操作时,数据会首先存储在缓冲区中,而不是直接写入磁盘。缓冲区根据特定的刷新策略定期或在特定条件下将数据写入磁盘。这样可以减少磁盘的频繁读写动作,从而提升整体系统的效率。

◉ 减少等待时间

在没有缓冲区的情况下,每次文件读写操作都需要等待外设(如磁盘)就绪,这可能会导致显著的等待时间。缓冲区减少了这种等待时间,因为数据可以暂时存储在内存中,进程可以继续执行其他任务,而无需等待外设操作完成。

先编辑code.c

#include<stdio.h>
int main()
{
    printf("Hello makefile...");
    sleep(3);
    return 0;
}

makefile

bin=mytest
src=code.c
$(bin):$(src)
	@gcc -o $@ $^ -std=c99
	@echo "complier $(src) to $(bin)"
.PHONY:clean
clean:
	@rm -rf $(bin)
	@echo "clean project..."

在这里插入图片描述

如果我们去掉hello Makefile!\n中的 \n 呢?
在这里插入图片描述

这说明,printf 已经先执行了,只不过输出内容并没有马上显式出来。

整个过程就是程序自上而下先执行printf将hello Makefile! 先输入到我们的缓冲区,再执行sleep(执行顺序是不变的),执行完sleep后,再将输入内容输出到显示器上。

但是刚刚我们发现,如果有\n 会先打印输出内容。

没错 \n 使得我们缓冲区立马刷新。

3.刷新策略

缓冲区的刷新策略决定了何时将缓冲区中的数据真正写入到目标存储器,如磁盘或显示器。主要有以下几种策略:

❍ 无缓冲(Unbuffered)

数据一写入缓冲区就立即刷新写入目标设备。这种方式适合对时间敏感的操作,但可能导致系统资源的低效利用。 ❍ 行缓冲(Line Buffered) ​ 当缓冲区检测到换行符(\n)时,立即刷新写入目标设备。这种方式常用于终端显示器,以保证一行行的输出效果。例如,在终端或控制台输出时,行缓冲能确保即时显示用户输入的一行内容。 ❍ 全缓冲(Fully Buffered) ​ 只有当缓冲区满了时,才会将数据刷新写入目标设备。这种方式适合大量数据的写入操作,能提高整体的写入效率。例如,在将数据写入磁盘文件时,通常使用全缓冲策略。 ❍ 特殊策略

a.用户强制刷新 用户可以显式调用刷新函数(如 fflush(FILE *stream))来强制刷新缓冲区内容。 ​ b.进程退出刷新 当进程正常退出时,缓冲区会自动刷新,以确保所有已写入缓冲区但尚未写入目标设备的数据都被处理完毕。

如果我们想让上面的hello Makefile!马上打印就可以执行下面的操作

#include<stdio.h>
#include<unistd.h>
int main()
{
    printf("Hello makefile...");
     fflush(stdout);//用户强制刷新
    sleep(3);
    return 0;
}

在这里插入图片描述
这里马上就打印出来了。

4.缓冲区位置

标准输入输出流(stdin、stdout、stderr)和文件流都是 FILE* 类型,它们在缓冲区管理中扮演了重要角色。当我们打开一个文件时,系统会返回一个 FILE* 类型的指针,文件的读写和关闭操作都需要该指针作为参数。

内部结构

struct FILE 封装了文件描述符(fd)、缓冲区以及缓冲区刷新策略。这使得文件操作变得高效和透明,开发者无需关心低级别的文件操作细节。

总的来说缓冲区是提高系统数据读写效率的重要机制。理解和有效利用缓冲区及其刷新策略,可以显著提升程序性能和资源利用效率。

实现倒计时

首先认识两个操作符

回车+换行:/n

回车:/r

#include<stdio.h>
#include<unistd.h>
int main()
{
    int cnt=10;
    while(cnt>=0)
    {
         printf("倒计时开始:%2d\n",cnt);
         cnt--;
         fflush(stdout);
         sleep(1);
    }
    printf("倒计时结束");
    return 0;
}

在这里插入图片描述

实现进度条

版本1:

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#define MAX 100
int main()
{
    int i=0;
    char bar[MAX+5];//设置进度条字符数组
    memset(bar,0,sizeof(bar));//初始化 
    const char* arr="|\\-/"; //旋转字符数组
    while(i<=100)
    {
        printf("[%-100s][%3d%%] %c\r",bar,i,arr[i%4]);//防止越界  
        fflush(stdout);//马上刷新     
        bar[i]='=';
        bar[i+1]='>';//进度条符号
        i++;
        usleep(5000);//0.5秒的缓冲时间 
    }
    printf("\n");//换行刷新 
    return 0;
}

在这里插入图片描述
版本2:

//version 2
void ProcBar(double total, double current)
{
    char bar[Length];
    memset(bar, '\0', sizeof(bar));
    int len = strlen(lable);
 
    int cnt = 0;
    double rate = (current*100.0)/total;
    int loop_count = (int)rate;
    while(cnt <= loop_count)
    {
        bar[cnt++] = Style;
        //usleep(20000);
    }
    printf("[%-100s][%.1lf%%][%c]\r", bar, rate, lable[cnt%len]);
    fflush(stdout);
}

Linux调试器----gdb

背景
◉ 程序的发布方式有两种,debug模式和release模式

◉ Linux gcc/g++ 出来的二进制程序,默认是 release模式

◉ 要使用gdb调试,必须在源代码生成二进制程序的时候,加上 -g 选项

开始使用
生成debug文件

gcc -g -o mytest.exe test1.c

开始调试

gdb mytest.exe

退出调试

ctrl + d 或者 quit

❍ list/l 行号:显式binFile源代码,接着上次的位置往下列,每次列10行

❍ list/l 函数名:列出某个函数的源代码

❍ r 或 run:运行程序

❍ n 或 next:单条执行

❍ s 或 step:进入函数调用1

❍ break(b) 行号:在某一行设置断点

❍ info break:查看断点信息

❍ finish:执行到当前函数返回,然后停下来等待命令

❍ print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数

❍ p 变量:打印变量值

❍ set var:修改变量的值

❍ continue(或c):运行至下一个断点处

❍ run 或 r:从开始连续而非单步执行程序

❍ delete breakpoints:删除所有断点

❍ delete breakpoints n:删除序号为 n 的断点

❍ disable breakpoints:禁用断点

❍ enable breakpoints:启用断点

❍ info( i ) breakpoints:查看当前设置了哪些断点

❍ display 变量名:跟踪查看一个变量,每次停下来都显示它的值

❍ undisplay: 取消对先前设置的那些变量的跟踪

❍ until X行号:跳至X行

❍ breaktrace(或bt):查看各级函数调用及参数

❍ info(i) locals:查看当前栈帧局部变量的值

❍ quit: 退出gdb

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

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

相关文章

魔百和 HG680-MC免拆 2+8免拆机卡刷固件

HG680MC免拆完美bin卡刷24年10月21日版本【修复语音、ADB端口9999、开启ADB的Root权限】 更新特点&#xff1a; 1.更新开机桌面为SMART动画&#xff1b; 2.安装app自动安装&#xff0c;无需点击确认、下一步等提示按钮内容; 3.ADB端口号为9999&#xff1b; 4.ADB权限为完美RO…

wireshark 解密浏览器https数据包

一、导出浏览器证书有两种方法 1、在浏览器快捷方式追加启动参数&#xff1a; --ssl-key-log-file"d:\log\2.log" C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe --ssl-key-log-file"d:\log\2.log" 2、环境变量中新建用…

SpringbootSpringcloud面试题(含代码及展示图)

1 简单说一下springboot? Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程。 -使用springboot以后,搭建一个spring应用和开发&#xff0c;部署变得很简单. 2 怎么简单实现一个springboot应用 1&#xff09;新建ma…

SpringBoot获取bean的几种方式

目录 一、BeanFactory与ApplicationContext的区别 二、通过BeanFactory获取 三、通过BeanFactoryAware获取 四、启动获取ApplicationContext 五、通过继承ApplicationObjectSupport 六、通过继承WebApplicationObjectSupport 七、通过WebApplicationContextUtils 八、通…

Chrome DevTools 三: Performance 性能面板扩展—— 性能优化

Performance 性能 &#xff08;一&#xff09;性能指标 首次内容绘制 (First Contentful Paint&#xff0c;FCP)&#xff1a; 任意内容在页面上完成渲染的时间 最大内容绘制 (Largest Contentful Paint&#xff0c;LCP)&#xff1a; 最大内容在页面上完成渲染的时间 第一字节…

创客项目秀|基于XIAO ESP32C3的本地个人助理Mr.M

作者&#xff1a;Matthew Yu 来自&#xff1a;Fab academy 在数字化时代的浪潮中&#xff0c;柴火创客空间作为创新与实践的摇篮&#xff0c;不仅为Fab Academy 2024的学员们提供了一个充满活力的学习和创作环境&#xff0c;更是将科技的力量与人文关怀深度融合。今天&#x…

Redis——事务

文章目录 Redis 事务Redis 的事务和 MySQL 事务的区别:事务操作MULTIEXECDISCARDWATCHUNWATCHwatch的实现原理 总结 Redis 事务 什么是事务 Redis 的事务和 MySQL 的事务 概念上是类似的. 都是把⼀系列操作绑定成⼀组. 让这⼀组能够批量执行 Redis 的事务和 MySQL 事务的区别:…

【Next.js 项目实战系列】07-分配 Issue 给用户

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】06-身份验证 分配 Issue 给用户 本节代码链接 Select Button​ # /app/issues/[i…

【Java】正则表达式详解

目录 引言 一、基本概念 1.1 元字符 1.2 预定义字符类 1.3 边界匹配符 1.4 数量标识符 1.5 捕获与非捕获分组 二、Java中的正则表达式支持 三、正则表达式的使用示例 3.1 匹配字符串 3.2 替换字符串 3.3 分割字符串 3.4 使用Pattern和Matcher 3.5 捕获组和后向…

【电商项目】1分布式基础篇

1 项目简介 1.2 项目架构图 1.2.1 项目微服务架构图 1.2.2 微服务划分图 2 分布式基础概念 3 Linux系统环境搭建 查看网络IP和网关 linux网络环境配置 补充P123&#xff08;修改linux网络设置&开启root密码访问&#xff09; 设置主机名和hosts映射 主机名解析过程分析&…

金九银十互联网大厂Java高频面试题(2024最新含答案)

2024 年的互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;一直以来我都想整理一套完美的面试宝典&#xff0c;奈何难抽出时间&#xff0c;这套 1200道的 Java 面试手册我整理了整整 1 个月&#xff0c;上传到 Git 上目前 star 数达到了 30K 这套互联网 Jav…

冲击美团!已成功 OC

这是一位训练营学员的美团面经&#xff0c;目前已经 OC 。 在此之前他已经拿到了不少公司的offer&#xff0c;但是都达不到他的预期&#xff0c;美团给的待遇就非常不错&#xff0c;大厂不愧是大厂&#xff0c;就是不知道工作强度如何。 他经历了一共三场面试&#xff0c;一面…

实现省略号查看详情样式

1.期望实现效果 2.目前实现效果 3.实现代码 1.wxml<view class"desc-text"><view class"show-more">查看详情 >></view><!-- <rich-text nodes"{{富文本接口数据内容 }}"></rich-text> --><text&…

python反爬

1.无限debug无法f12 关闭掉 Deactivate Breakpoints

【闲谈程序设计例三则:抛弃传统单步进初级阶段,用推导归纳出来的规律写代码,进入进阶阶段,人类自性的高级活动。】2024-10-21

闲谈程序设计三则&#xff1a;抛弃传统单步进&#xff0c;用推导归纳出来的规律写代码。 本论坛常见新学提问都是一些入门级别的问题&#xff0c;近来AI活跃抢答&#xff0c;然而&#xff0c;对于有些问题AI可以说是答非所问&#xff0c;令人哭笑不得&#xff0c;而AI能回答的…

MacOS安装BurpSuite

文章目录 一、下载地址二、下载注册机三、安装教程四、启动burpsuit五、免责声明 一、下载地址 https://portswigger-cdn.net/burp/releases/download?productpro&version2024.7.1&typeMacOsx二、下载注册机 https://github.com/NepoloHebo/BurpSuite-BurpLoaderKey…

B站协议登录到实现各种功能完整代码(专栏总结)

B站协议登录、点赞、收藏、转发实现及代码 关注、动态转发实现动态抽奖实现及代码 直播预约抽奖实现及代码 本文为本专栏的总结文章 一、扫码登录 请求获取二维码包&#xff0c;得到二维码链接和qrcode_key参数之后&#xff0c;利用qrcode_key循环GET请求登录状态包即可&#x…

【word】页眉横线无法取消

小伙伴们日常想在页眉里加横线&#xff0c;直接双击页眉&#xff0c;然后在页眉横线里选择自己喜欢的横线样式就可以了。 但今天我遇到的这个比较奇特&#xff0c;有些页有这个横线&#xff0c;有些页没有&#xff0c;就很奇怪。 最后排查完&#xff0c;发现是只有标题2的页…

WPF入门_02依赖属性

1、依赖属性主要有以下三个优点 1)依赖属性加入了属性变化通知、限制、验证等功能。这样可以使我们更方便地实现应用,同时大大减少了代码量 2)节约内存:在WinForm中,每个UI控件的属性都赋予了初始值,这样每个相同的控件在内存中都会保存一份初始值。而WPF依赖属性很好地…

《向量数据库指南》揭秘:Mlivus Cloud如何赋能GraphRAG应用

嘿,各位向量数据库和AI领域的探索者们,我是你们的老朋友,大禹智库的向量数据库高级研究员王帅旭,也是《向量数据库指南》的作者。今天,咱们来聊聊一个既前沿又实用的话题——检索增强生成(Retrieval Augmented Generation,简称RAG)及其面临的挑战,特别是如何用Mlivus …