(9)Linux Git的介绍以及缓冲区

news2024/12/23 13:52:00

💭 前言

本章我们先对缓冲区的概念进行一个详细的探究,之后会带着大家一步步去编写一个简陋的 "进度条" 小程序。最后我们来介绍一下 Git,着重讲解一下 Git 三板斧,一般只要掌握三板斧就基本够用了。

缓冲区(Buffer)

先说一下 unistd.h 库中的 sleep 函数,它可以按照秒去休眠

我们先创建一个文件,并写一些代码:

#include <stdio.h>
#include <unistd.h>
 
int main(void) {
    printf("Helo,World!\n");  
    sleep(2);                 
 
    return 0;
} 

??这里是先运行printf还是sleep???

这还用思考?肯定打出 Helo, World,先运行A 处代码,然后运行 B 处代码休眠 2s

如果说:我们把\n给删了呢?

这里是休眠了2s后,才出现的hello world。怎么说???

 看样子是先执行 B 再执行 A 了,but……

然而实际上,无论你加不加 \n,代码都是从上往下先运行的,即先执行 printf 再执行 sleep!

代码没有任何的循环判断跳转什么的操作,那一定是 从上到下按顺序执行的,要坚信自己!

这就是所谓的 "顺序结构",也是我们的默认结构。

既然是从上到下按顺序执行,可是我们运行代码观察到的现象就是 sleep 先休眠 2s 然后打印啊。

真像:实际上,printf 已经先执行了,只是这个 "Helo,World" 没有立马被显示出来罢了!

当我们 sleep 时也没有显示,当我们 sleep 完甚至到程序退出后,这个 "Helo,World" 才显示出来。

这个时候如果打印的消息如果没有立即被显示出来,

在 sleep 执行期间它最后显示出来证明了它的存在,

但是 sleep 2s 内它并没有显示出来,那么问题来了 —— 这个 "Helo,World" 在哪?
没错,这就是就是  " 缓冲区 " !

对缓冲区的理解

什么是缓冲区?这个缓冲区在哪里?缓冲区其实说白了,就是一段内存空间。

既然是内存空间,那我们就能理解刚才举的例子里的 "Helo,World" 数据是放在了内存空间里。

只要在内存里就没有打印出来,所以我们 sleep 2s 时它一直在内存里 "躺平" 呢。

最后 return 退出的时候,这个数据才显示出来,所以才看到了我们刚才看到的现象

缓冲区的理解:就是一段内存空间。立马将内存中的空间显示出来 →刷新策略 

我们今天不探讨什么策略,就往显示器打印这个点来说,我们只关注一种策略 —— 行刷新 !

所谓的行刷新,就是你要输出的一个行字符串当中,看它是不是一个完整行,

如果是一个完整行,就会立马刷新出来;如果不是,就不刷新,让它去缓冲区一边凉快去,

等缓冲区变满了或者程序退出了,再或者碰到换行服务,再把它一块送出去。

那么,如何证明你一个文本是完整的一行呢?

这也很简单,只要你打印的内容包含 \n,包含反斜杠 n 在内的之前的所有内容成为一行。

不是直接把数据刷到我们外设上, 还是把数据先放到缓冲区里,只不过因为你有 \n,

它就立马根据刷新策略,把内容给你刷新出来,仅此而已。

如果我不想用 \n,我就想让我的数据立马刷新出去(立马显示出来)呢?

这里就说来话长了,我们不得不说一下 stdin、stdout 和 stderr 的知识。

 一般一个程序默认在启动的时候会默认打开三个输入输出流:

#include <stdio.h>
 
extern FILE* stdin;
extern FILE* stdout;
extern FILE* stderr;

 如何刷新呢?我们还可以通过 fflush() 去强制刷新:

#include <stdio.h>
 
int fflush(FILE* stream);

 如果你仔细观察你会发现它的参数和我们 stdin、stdout 和 stderr 类型是一样的,都是 FILE*

在没有 \n 时,我们通过 fflush 让它打印完立马给我刷新: 

运行结果如下:

 

此时的Hello world!是立刻就显示出来了。

实现一个简易 "进度条"

在实现简易 "进度条" 之前,我们还需要讲解一下回车和换行的概念。

思考:你认为回车和换行是一个概念吗?

  • 回车:将光标拨回到当前行的最开始(最左侧)
  • 换行:新起一行(并不影响光标的位置)

我们所理解的 "换行"  并不是这里的换行,想达到我们所理解的 "换行" 效果,

即新起一行并将光标拨回最开始位置,就需要:

先模拟 "倒计时"

代码演示:从 9 开始倒计时

运行结果:

由9一直倒数

开始实现简易进度条

 我们先创建一个空文件夹,并创建一个 process.c 文件:

然后我们形成一个 Makefile 文件:

然后我们打开刚才创建的 process.c 文件,我们实现出 '#' 的填充部分:

定义一个 process() 函数,用于实现进度条。我们假设 100 个单位,定义一个宏 TIMES 表示,然后创建 bar 数组存放,因为最后要存 \0 所以这里我们需要多预留一个位置给它,所以定义一个 TIMES+1 的宏,名曰 NUM。为了方便,我们索性使用 memset 将所有缓冲区空间设置为 \0。

然后开始我们的计数操作,创建一个 cnt 变量 while 它个 100 下,每次打印 bar 中的 1 个,然后用 # 填充 cnt 对应位置的 bar 元素。
运行结果如下:

emm,现在显然有两个问题亟待解决:

  • sleep 一秒,这是打印地是否有些太慢……
  • 这个进度条是否有些奇葩,哪有换行打的进度条雾草,太摩登了

我们先来解决第一个问题,看看 usleep 函数 

按照微秒为单位去休眠,我们 usleep(20000) ,能让它 2 秒内跑完。

20000μs=20ms=0.02s

然后我们刚才还讲解缓冲区概念,的时候还介绍了 fflush()  和 \r,在这里就派上用场了。

和刚才的倒计时一样,这里换行的主要原因还是我们 printf 用了 \n,我们修改一下写的代码:

运行结果如下:

 

不错,有个进度条的样子了。但好像没有给进度条预留一块空间啊,

现在的进度条是带着 [ ] 直接往后怼的,我们可以给 [ ] 预留 100 个 字符空间:

printf("[%100s]\r", bar);

虽然给 [ ] 预留空间了,但是是从右往左反过来打的。

为什么会这样呢?因为 C 语言默认的对齐方式是右对齐的,如果想让它左对齐,就要加 -

printf("[%-100s]\r", bar);

 

下面我们来加上 "百分比"

百分比不就是我们定义的 cnt 变量么?我们打印出来就行:

printf("[%-100s] [%d %%]\r", bar, cnt);

 

最后,我们再实现一下 "不断旋转的光标",就大功告成了。

想做到不断旋转的视觉效果,通过   | / - \ 这四个符号不断变化即可。

由于 \ 需要用转义才能表示,所以需要 \\ ,我们把它们存到变量中。

打印时,访问我们定义的变量即可,这里将  cnt % 4 就可以按顺序循环访问这四个字符了。

/* 不断旋转的光标:   | / - \   */
  const char* lable = "|/-\\";
 
  int cnt = 0;
  while (cnt <= TIMES) {
    printf("[%-100s] [%d%%] ... %c\r", bar, cnt, lable[cnt % 4]);  // 改成\r

运行结果如下:

翻过这座山,我们是------冠军!!!!!!!!!

Git 简单介绍

git 是什么?

git是一种代码管理器,写git程序的和写Linux系统的是同一个人,所以Linux可以直接和gitee或GitHub相关联!

GitHub: Let’s build from here · GitHub

Gitee - 基于 Git 的代码托管和研发协作平台

 这里使用gitee举例子:先在远端创建仓库

合法的

(我敲~这个为什么是倒着的啊???)

Linux下的gitee创建仓库

在创建好仓库后,复杂https的链接

使用指令: git clone 链接

即可将远端仓库克隆到本地
接下来的操作和Windows上的三板斧相似:

首先在本地仓库创建一份文件:

注意:是在本地仓库里面创建的。

git三板斧之add

 我们在当前目录下直接输入指令:

git add 文件名 或 git add .

前者是添加特定的文件到本地仓库
后者是将当前目录下所有文件提交

输入完这条指令后,文件就已经被添加到本地仓库了

那么怎样在本地仓库查看有哪些文件呢?

使用指令: git status

 

可以发现,本地仓库中还有test.c。没有被提交到远端仓库!

git三板斧之commit

请注意,在commit时一定要输入日志

 使用指令: git commit -m "日志"

日志一定不要乱写!
日志一定不要乱写!
日志一定不要乱写!
 

你的gitee或GitHub,就会去看日志! 

比如这里我可以这样写日志:、

输入此指令后,如果你是第一次输入,系统可能会让你输入邮箱和用户名密码,这时系统会将指令的格式给你显示出来,你只需要将格式中引号内的内容改成你的自己的邮箱或用户有即可!

或者你也可以事先输入好

user代表用户,.name代表配置用户的名称

git config --global user.name "你的用户名"

user代表用户,.email代表配置用户的邮箱

git config --global user.email "你的邮箱"

 这样就好了

git三板斧之push

在commit输入完日志后,输入指令:

git push 

将本地仓库的文件推送至远端仓库!

输入这条指令后,会显示这样的画面:

注:账号最好是输入下面红框里的:

我们登录gitee就会看到:

最后:

大家要维护好自己的gitee或GitHub
一年都百分之80都是小绿点会很加分的!

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

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

相关文章

PostgresSQL数据库中分区和分表的区别以及PostgresSQL创建表分区分表示例

1.分区分表理解 数据库分区和分表都是数据库中常用的数据分散存储技术&#xff0c;但它们的实现方式和应用场景有所不同。 分表&#xff1a;将一个大的表拆分成多个小的表&#xff0c;每个子表存储一部分数据。分表可以减轻单个表的数据量&#xff0c;提高查询效率&#xff0c…

系统架构设计师教程(八)系统质量属性与架构评估

系统质量属性与架构评估 8.1 软件系统质量属性8.1.1 质量属性概念开发期质量属性运行期质量属性 8.1.2 面向架构评估的质量属性8.1.3 质量属性场景描述 8.2 系统架构评估8.2.1 系统架构评估中的重要概念8.2.2 系统架构评估方法SAAM 方法ATAM方法CBAM 方法其他方法 8.3 ATAM方法…

C++继承与派生——(2)派生类

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 缺乏明确的目标&#xff0c;一生将庸庸…

内网渗透:拿下一台内网主机后如何继续攻击拿下域控主机

目录 #### 域的定义&#xff1a;将网络中的多台计算机在逻辑上组织到一起&#xff0c;进行集中管理。 域控攻击目标 1. 判断当前主机是否在域中 windows系统的三种登录方式 NTLM协议 从上篇文章拿下10.0.1.4这台服务器后&#xff0c;发展对内网进行攻击&#xff0c;打穿这…

[SWPUCTF 2021 新生赛]easy_md5

打开环境 这儿考弱比较&#xff0c;之前的WP里写过绕过方法&#xff0c;这儿我们直接数组绕过 构造GET传参name[]123 , POST传参password[]456得到flag

在区块链中看CHAT的独特见解

问CHAT&#xff1a;谈谈对区块链以及区块链金融的理解 CHAT回复&#xff1a;区块链是一种去中心化的分布式数据库技术&#xff0c;这种技术通过加密算法&#xff0c;使数据在网络中传输和存储的过程变得更加安全可靠。区块链的出现引领了存储、交易等形式的革命&#xff0c;改变…

SSH无密登陆配置

1 SSH介绍 ssh命令用于远程登录到其他计算机&#xff0c;实现安全的远程管理。 基本语法&#xff1a; ssh 域名/IP地址 示例&#xff1a; &#xff08;1&#xff09;从hadoop100服务器上远程连接hadoop101服务器 [hadoophadoop100 ~]$ ssh hadoop101 如果出现如下内容 Ar…

【科技前沿】数字孪生技术改革智慧供热,换热站3D可视化引领未来

换热站作为供热系统不可或缺的一部分&#xff0c;其能源消耗对城市环保至关重要。在双碳目标下&#xff0c;供热企业可通过搭建智慧供热系统&#xff0c;实现供热方式的低碳、高效、智能化&#xff0c;从而减少碳排放和能源浪费。通过应用物联网、大数据等高新技术&#xff0c;…

Mac如何搭建本地服务器

苹果电脑Mac OS X系统自带了Apache服务器 打开终端 //开启apache&#xff1a;sudo apachectl start //重启apache&#xff1a;sudo apachectl restart //关闭apache&#xff1a;sudo apachectl stop在浏览器输入127.0.10.1 &#xff0c; 如果页面出现 it works&#xff0c;则…

数据可视化分析大屏,大数据统计UI页面源文件(信息分析平台免费PS资料)

数据可视化可以帮助数据分析者更好地理解数据&#xff0c;发现数据中的规律和趋势。通过图表和图形等可视化工具&#xff0c;数据分析者可以更快速地发现数据中的关系&#xff0c;比如相关性、趋势、异常值等。对于普通用户来说&#xff0c;理解复杂的数据可能会很困难。通过数…

11 Vue3中v-bind绑定动态样式和动态样式类

概述 v-bind指令可以说是Vue3中最常用的指令之一&#xff0c;使用v-bind&#xff0c;我们几乎能够给任何实现动态的绑定比值。 这里&#xff0c;我们主要演示以下&#xff0c;通过v-bind动态绑定CSS样式。 基本用法 我们创建src/components/Demo11.vue&#xff0c;在这个组…

Android App程序应用未校验签名证书——————《风险等级高》

目录 应用签名未校验风险1、检测目的2、风险等级3、检测依据4、风险描述5、检测步骤6、结果描述7、解决方案7.1、Android 检验 APK 是否签名的代码7.2、检验APK签名 8、结尾 应用签名未校验风险 1、检测目的 检测App程序启动时是否校验签名证书。 防止App的盗版率。未进行签…

vscode打开多个标签页配置

前言 如果其中一个标签的文件没有修改&#xff0c;再打开一个文件时之前的打开的标签页就会被替换掉。 在工作中使用很不方便。 解决办法 文件-首选项--设置 下图取消勾选 取消之后如下 再去打开标签就会一致显示了

14:00面试,14:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

C++ Qt开发:StringListModel字符串列表映射组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QStringListModel字符串映射组件的常用方法及…

【QT Visual Studio环境配置】error MSB8020: 无法找到 v141/v142 的生成工具(完整版)

首先要了解V**平台工具集根据你安装的Visual Studio版本不同而有所区别&#xff0c;知道这个就容易解决问题了&#xff0c;确定你安装的那个版本&#xff0c;需要使用哪个工具集。 v143–>VS2022v142–>VS2019v141–>VS2017v140–>VS2015v120–>VS2013 一、解决…

【网络编程】poll和epoll服务器的设计

文章目录 前言一、poll二、epoll 1.epoll初识2.epoll服务器的设计3.epoll的工作原理4.epoll的优点5.epoll的工作模式总结 前言 poll和select一样&#xff0c;也是一种linux中的多路转接的方案。而poll解决了select的两个问题&#xff1a; 1.select的文件描述符有上限的问题。…

05鸿蒙APP开发之加载网络列表

目录 1、概述2、http请求封装2.1、为什么要封装Http请求&#xff1f;2.2、封装后的网络请求 3、发起请求并渲染列表数据第一步&#xff1a;准备一个目前能用的&#xff0c;测试API地址&#xff0c;如下&#xff1a;第二步&#xff1a;创建对应的实体对象第三步&#xff1a;调用…

10 Vue3中v-html指令的用法

概述 v-html主要是用来渲染富文本内容&#xff0c;比如评论信息&#xff0c;新闻信息&#xff0c;文章信息等。 v-html是一个特别不安全的指令&#xff0c;因为它会将文本以HTML的显示进行渲染&#xff0c;一旦文本里面包含一些恶意的js代码&#xff0c;可能会导致整个网页发…

对大学生创新创业某赛事目前存在的烂尾楼现象的一些研究的分享(1)

经过对”某某网”大学生创新创业大赛国赛第五届-第八届部分金奖项目的研究&#xff0c;进行较为充分的信息溯源、穿透调查&#xff0c;我发现不少项目存在赛事材料画大饼&#xff0c;严重不切合实际&#xff0c;参赛人员并非真正创新创业&#xff0c;赛后迅速销声匿迹、烂尾切割…