【看表情包学Linux】缓冲区的概念 | Git 三板斧 | 实现简易进度条

这篇具有很好参考价值的文章主要介绍了【看表情包学Linux】缓冲区的概念 | Git 三板斧 | 实现简易进度条。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git爆笑教程,只送有缘人 👉 《看表情包学Linux》

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

💭 写在前面:本章我们先对缓冲区的概念进行一个详细的探究,之后会带着大家一步步去编写一个简陋的 "进度条" 小程序,过程还是挺有意思的,虽然实现的过程表现得非常沙雕,但它是本 Linux 专栏中第一个小程序。在讲解进度条的实现之前还会讲解一下 "回车和换行" 的区别。最后我们来介绍一下 Git,着重讲解一下 Git 三板斧,一般只要掌握三板斧就基本够用了。

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 本篇博客全站热榜排名:未上榜


Ⅰ. 缓冲区(Buffer)

0x00 引入:发现 "缓冲区" 的存在

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

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

💬 代码演示:

#include <stdio.h>
#include <unistd.h>

int main(void) {
    printf("Helo,World!\n");  
    sleep(2);                 

    return 0;
} 

❓ 思考:首先运行的是   处的代码,还是  处的代码?

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

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

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

竞猜环节!如果我们把 Helo,World 后面的 \n 给去掉,此时是先执行  还是先执行  ?

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 看样子是先执行  再执行  了,but……

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

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

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

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

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 怎么肥事啊!!!

" 呵呵,printf 已经执行了,但是数据还没有刷新出来。"

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

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

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

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

但是 sleep  内它并没有显示出来,那么问题来了 —— 这个 "Helo,World" 在哪?

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 难道有什么东西存着它吗?没错!有!这,就是  " 缓冲区 " !

0x01 缓冲区的理解

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 什么是缓冲区?这个缓冲区在哪里?缓冲区其实说白了,就是一段内存空间。

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

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

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

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

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

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

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

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

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

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git那么,如何证明你一个文本是完整的一行呢?

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

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

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

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

这里就说来话长了,我们不得不说一下 stdinstdoutstderr 的知识。

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git  一般一个程序默认在启动的时候会默认打开三个输入输出流:

#include <stdio.h>

extern FILE* stdin;
extern FILE* stdout;
extern FILE* stderr;

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

#include <stdio.h>

int fflush(FILE* stream);

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

" 实际上你们所有的 printf 底层打印的都是往 stdout 里丢的 "

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

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

🚩 运行结果如下:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

Ⅱ. 实现一个简易 "进度条"

0x00 回车和换行的概念

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 在实现简易 "进度条" 之前,我们还需要讲解一下回车和换行的概念。

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

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

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

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

回车 git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 换行

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 下面我们正式来谈一谈 "回车 + 换行" 的问题。

回车对应的就是 \r,而我们在 C语言中经常使用的 \n 其实就是 "回车 + 换行"。

0x01 先学会模拟 "倒计时"

为了写 "进度条",我们先来模拟一下 "倒计时" 

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

#include <stdio.h>
#include <unistd.h>

int main(void) {
  int cnt = 9;
  while (cnt) {
    printf("%d\r", cnt--);
    fflush(stdout);
    sleep(1);
  }

  return 0;
}

🚩 运行结果演示:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

0x02 开始实现简易进度条

我们想要实现的效果:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

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

$ mkdir process_bar
$ touch process.c

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

 git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

process:process.c
	gcc -o process process.c
.PHONY:clean
clean:
	rm -f process 

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

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

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

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

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git然后让程序睡个一秒再继续走循环判断。

🚩 运行结果如下:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

 …… 额,这进度条未免有些沙雕哈,没关系,这是初始版嘛,很正常 ㅋㅋㅋㅋㅋ

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

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

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

$ man 3 usleep

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

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

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

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

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define TIMES 100
#define NUM TIMES+1

void process() {
  char bar[NUM];
  memset(bar, '\0', sizeof(bar));  // 将所有缓冲区空间设置为\0

  int cnt = 0;
  while (cnt <= TIMES) {
    printf("[%s]\r", bar);  // 改成\r
    fflush(stdout);         // 将数据立马显示出来

    bar[cnt++] = '#';   // 填充#作为进度图例

    usleep(20000);      // 休眠0.02s  
  }
  
  printf("\n");    // 跑完再让他换个行
}

int main(void) {
  process();
  return 0;
}

🚩 运行结果如下:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

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

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

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

我们来看看效果如何,3,2,1 笑:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

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

  从右往左?阿拉伯兄弟直呼内行! 

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

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

这下就没有问题了:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

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

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

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

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

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

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

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

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

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

/* 不断旋转的光标:   | / - \   */
  const char* lable = "|/-\\";

  int cnt = 0;
  while (cnt <= TIMES) {
    printf("[%-100s] [%d%%] ... %c\r", bar, cnt, lable[cnt % 4]);  // 改成\r

🚩 运行结果如下:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git简易的进度条就大功告成了 ~

Ⅲ.  Git 介绍

0x00 引入:git 是什么?

Git 是一个分布式版本控制系统,它允许多个人在同一个项目中进行协作。

它允许用户在开发过程中跟踪文件的更改,并在需要时回滚到之前的版本。

这样可以在团队协作开发时避免冲突,并保证项目的完整性。

0x01 在 Github 创建项目

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 点击 Repositories 进入如下页面,然后点击 New:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

创建 repository:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

在创建好的项目页面中复制项目的链接,以备接下来进行下载:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 创建好仓库后,如果我想把代码提交到 git,我们可以把 HTTPS 的内容复制下来。

0x02  git clone 克隆

复制好 url 后,如果想把远端的仓库克隆到本地,我们可以用 git clone 指令。

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 创建一个放置代码的目录:

git clone [url]        # 此处的 url 是刚刚建立好的项目的链接

第一次的时候会让你输入账号和密码:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

此时我们就能看到仓库的名字,赫然纸上:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

这,就是我们从远端拉去下来的我们所建立的项目。

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

你可以进 .git 仓库里看看,看看就行,不要对里面的东西做任何的修改!

如果我们想把我们的代码提交上去,比如我们创建一个 test.c 文件:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

如果你想在提交之前看看 本地仓库 远端仓库 之间的关系,你可以输入 git status 查验:

git status

 git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

0x03 三板斧之第一板斧 —— git add 添加

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 如果想上传到远端,我们就要使用 git add 指令来操作了。

git add [file name]

我们试着把刚才创建的 test.c 文件添加到我们本地的仓库:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

(第一次使用 git 的时候,可能会让你配置一下你的用户名和邮箱)

添加到本地仓库之后,我们再介绍一个 git commit 指令,提交日志。

0x04 三板斧之第二板斧 —— git commit -m

git commit -m     # -m选项代表的是本次的提交日志
# 提交时应该表明提交日志、描述改动的详细内容,务必培养这个好习惯。

提交日志要好好写,不要瞎写,因为这是要给人看的,你写的一切殊不知……

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git 日志存在的目的是为了给人看的,也是给自己看的。

写些什么呢?写一写你做了什么东西,比如:

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

0x05  三板斧之第三板斧 —— git push 推入

刚才已经将 test.c 存入本地仓库了,现在我们想要把它传送到远端仓库,即远端服务器上:

git push

需要填入用户名与密码,同步成功后刷新 Github 页面就能看到代码改动啦。

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

🔺 总结: 建立仓库 → git clone git add → git commit -m "日志内容"git push

git缓冲区大小是什么,看表情包学Linux,linux,运维,服务器,git

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2023.1.12
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

比特科技. Linux[EB/OL]. 2021[2021.8.31 xi文章来源地址https://www.toymoban.com/news/detail-781070.html

到了这里,关于【看表情包学Linux】缓冲区的概念 | Git 三板斧 | 实现简易进度条的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】理解缓冲区

    我们发现 printf 和 fwrite (库函数)都输出了2次,而 write 只输出了一次(系统调用)。为什么呢?肯定和fork有关! C接口的函数被打印了两次系统接口前后只是打印了一次:和fork函数有关,fork会创建子进程。在创建子进程的时候,数据会被处理成两份,父子进程发生写时拷

    2024年01月23日
    浏览(44)
  • 【Linux】文件缓冲区

    提到文件缓冲区这个概念我们好像并不陌生,但是我们对于这个概念好像又是模糊的存在脑海中,之间我们在介绍c语言文件操作已经简单的提过这个概念,今天我们不妨深入理解什么是文件缓冲区 通过自己实现库中的一些文件操作函数更加深入的理解文件缓冲区 自定义实现

    2024年02月10日
    浏览(44)
  • 【Linux】深入理解缓冲区

    目录 什么是缓冲区 为什么要有缓冲区 缓冲区刷新策略 缓冲区在哪里  手动设计一个用户层缓冲区 缓冲区本质上一块内存区域,用来保存临时数据。 缓冲区在各种计算任务中都广泛应用,包括输入/输出操作、网络通信、图像处理、音频处理等。 这块内存区域是由 谁提供的

    2024年02月15日
    浏览(54)
  • 【linux】重定向+缓冲区

    自我名言 : 只有努力,才能追逐梦想,只有努力,才不会欺骗自己。 喜欢的点赞,收藏,关注一下把! close(1),为什么没有打印新建文件fd呢? printf(“%dn”,fd); printf会把内容打印到stdout文件中。 但是close(1)关闭标准输出stdout—显示器,int fd=open();新打开的文件fd是1。 st

    2024年02月08日
    浏览(37)
  • 【Linux】深入理解文件缓冲区

    问题引入 首先看一段代码: 运行代码,结果如下: 如果此时将输出结果重定向一下: 会发现 printf 、 fwrite 都打印了两次。 究其原因,就要谈到缓冲区和缓冲区刷新策略的概念了。 如何理解缓冲区 假设你在青岛,你要从网上买一件商品,商家所在地是北京。你不会跑去北

    2024年02月11日
    浏览(45)
  • 浅谈linux缓冲区的认识!

    今天来为大家分享一波关于缓冲区的知识!那么既然我们要谈缓冲区,那么就得从是什么?为什么?有什么作用这几个方面来谈论一下缓冲区!然后再通过一些代码来更加深刻的理解缓冲区的知识! 从最简单的理解方面来,我们可以将缓冲区理解成一块内存!那么这块内存是

    2024年02月05日
    浏览(44)
  • Linux之缓冲区的理解

    目录 一、问题引入 二、缓冲区 1、什么是缓冲区 2、刷新策略 3、缓冲区由谁提供 4、重看问题 三、缓冲区的简单实现 我们先来看看下面的代码:我们使用了C语言接口和系统调用接口来进行文件操作。在代码的最后,我们还使用fork函数创建了一个子进程。  代码运行结果如

    2024年02月03日
    浏览(38)
  • [Linux打怪升级之路]-缓冲区

    前言 作者 : 小蜗牛向前冲 名言 : 我可以接受失败,但我不能接受放弃    如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正  本期学习目标:认识什么是缓冲区,缓冲区在哪里,模拟实现一个简单的缓

    2024年02月07日
    浏览(41)
  • 【Linux】缓冲区+磁盘+动静态库

    缓冲区的本质就是一段用作缓存的 内存 。 节省进程进行数据IO的时间。进程使用fwrite等函数把数据拷贝到缓冲区或者外设中。 3.1、 立即刷新(无缓冲)——ffush() 情况很少,比如调用printf后,手动调用fflush刷新缓冲区。 3.2、 行刷新(行缓冲)——显示器 显示器需要满足人

    2024年02月05日
    浏览(30)
  • 【Linux】基础IO----理解缓冲区

    作者:დ旧言~ 座右铭:松树千年终是朽,槿花一日自为荣。 目标:理解缓冲区 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! 专栏选自:Linux初阶 望小伙伴们点赞👍收藏✨加关注哟💕💕 缓冲区大家其实不陌生,像我们使用的 VS2019 编译器这里就有缓冲区,那它

    2024年04月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包