写一个进度条
\r&\n
开始的开始,回车并不是一个直观的东西。转换成指令是两个,第一步另起一行,第二步回到本行起始处,所以回车键也就是一个拐弯的按键。
\r:回车
\n:换行
缓冲区
我们把整个输出过程比做一把枪,写输出内容就是装弹,真正输出就是发射子弹,而其中的枪膛就是缓冲区。假设以下情况。
printf("1\r");
马上要输出的时候,子弹卡膛了,输出不了,难受死。因为\r把光标回调了,只能输出光标之前的内容,而后面的就留在缓冲区了,但是这里加一个函数fflush(stdout)就可以了。意思就是缓冲区内容全输出后清理。
这样,就可以写出一个倒计时了。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void process()
{
char bar[101];
memset(bar,'\0',sizeof(bar));
int i=0;
while(i <= 100)
{
printf("[%s]\r",bar);
fflush(stdout);
bar[i++] = '#';
sleep(1);
}
}
int main()
{
process();
return 0;
}
知道上面的倒计时再结合所学的C语言知识就能写出上面的进度条啦。
gdb的使用(调试)
先来一张图。
当我们gdb开始调试可执行文件时,发现系统提示没有调试信息,第一个疑点就来了。原因其实也写在上面了,因为可执行程序出来后,也直接被优化成了release版本,并不是debug呢。
如图所示,我们只需要在编译的时候加上-g就可以了。
当输入以上指令时,可以查看debug版本的可调式信息哦。
接下来说下gdb的调试指令
第一个:查看代码,l 0 ,意思就是从第零行开始查看。
一直上传图片不好看,剩下的推荐大家自行尝试,良处多多呦。
第二个:直接执行程序,r 。
第三个:打断点,b 行号,info b,查看所有断点,d 断点序号,删除断点。
圈里的就是断点序号,删除只能按照序号删除。对比两次info后第一个断点信息,方框内信息表示该断点已经执行一次了。
第四个:disable breakpoint 断点序号 关闭断点,enable breakpoint 断点序号 开启断点。
第五个:n逐过程调试,s逐语句调试。
第六个:p 变量,查看当前变量的值。
第七个:display 变量,常显示该变量数值,undisplay 变量,关闭。
第八个:until 行号,在函数内,进行跳转,执行完该区间代码。
第九个:finish,立即执行完当前函数并且停下。
第十个:c,从一个断点处,执行到下一个断点处。
第十一个:set var 变量名 = x,设置某一个变量为特定值。
第十二个:bt,查看调用栈。
第十三个:quit,退出。
调试器核心工作是找到问题,不是解决问题。
所有查看类型的指令,不影响实际调试
冯诺依曼体系结构
我认为对于现在所学的知识,能有一个浅显的认知就可以,因为一旦深入,就像泥潭一样,深深陷入久拔不出。深入之后涉及到的知识太多,我们就把该层次能学到的知识学到了就可以了。
在硬件方面(输入设备就是键盘什么的,存储器就是内存,磁盘等等),所遵循的规则就是这套体系结构,红色部分是所谓的数据流动,就是上半部分的凹字,就是这样的凹,把每个用户链接了起来。然后就是读图咯,用户通过输入进行输出时,会有运算器转换存入存储器,期间控制器控制相关行动,最后输出。
一台计算机,最粗略的分类就是软硬件两类。在硬件有其相应的管理和数据流动,软件也是,然后不可缺少的,就是软硬件的链接:操作系统。
操作系统
计算器不能没有操作系统,就像西方不能失去耶路撒冷。
对下仔仔细细的管理好各种各样的数据,简单来说就是描述数据,然后管理。
对上好好的服务用户,对用户的需求分装出各种接口(只能是接口,不能完全开放,因为“群众里面有坏人”)。