Linux:Makefile 以及实现第一个程序:进度条

1.Makefile初认识

(1)Makefile内部结构的基本认识

(2)开始使用宏替换的进阶版本

(3)多文件的最终版本

BIN:可执行程序的别名

SRC = $(wildcart *.c):表示所有.c文件

OBJ = $(SRC: .c = .o):表示SRC下的所有.c文件转换成的.o文件

:把所有的.o文件转化成可执行程序

@表示:(BIN),\^表示:(OBJ))

:表示把所有.c文件转化成.o文件

(上面这两步是一个栈的过程):也就是说,上面那两部会首先执行下一步,把.c文件转化成.o文件,然后才会把.o文件转化成可执行程序

2.缓冲区的理解

在3s的休眠区内,虽然是printf先执行,但结果是存在于缓冲区的位置, 没有在显示器上呈现出来。

对此的显现方法有

(1)程序结束的时候:缓冲区自动刷新

(2)添加"\n"可以刷新

(3)使用fflush(stdout);也可是使得显示器刷新。

3.进度条程序的实现

(1)Makefile

该处参考1.(3)多文件实现的最终版本

:不存在任何的空格

cpp 复制代码
SRC = $(wildcard *.c)                                                                               
  2 OBJ = $(SRC:.c = .o)                                                                                
  3 BIN = processchar                                                                                   
  4                                                                                                     
  5 $(BIN):$(OBJ)                                                                                       
  6     gcc -o $@ $^                                                                                    
  7 %.o:%c                                                                                              
  8     gcc -c $< -std=c99                                                                              
  9 .PHONY:                                                                                             
 10 clean:                                                                                              
 11     rm -f $(OBJ) $(BIN)      

(2) main.c(主程序)

1.规定下载占用的总内存

下载速度

目前下载内存

cpp 复制代码
#include<stdio.h>                                                                                   
#include<unistd.h>                                                                                  
#include"process.h"                                                                                 
#define total 1024.0                                                                                
#define speed 1.0                                                                                   
                                                                                                       int main()                                                                                          
{                                                                                                   
     double current = 0;                                                                             
    while(current <= total)                                                                         
     {                                                                                               
         FlushProcess(total,current);                                                                
         usleep(3000);                                                                                                    
         current+=speed;                                                                             
     }                                                                                               
     printf("\ndownload %.2lfMB Done\n",current-1);                                                                                                                                                           
}                        

(3)process.c(实现程序)process.h(声明函数)

process.h

cpp 复制代码
#pragma                                      
  2 #include<stdio.h>                            
  3                                              
  4 void FlushProcess(double total,double current);             

process.c

cpp 复制代码
  1 #include"process.h"                                                                                 
  2 #include<string.h>                                                                                  
  3 #include<unistd.h>                                                                                  
  4 #define STYLE '*'                                                                                   
  5 #define NUM 101                                                                                     
  6 void FlushProcess(double total,double current)                                                      
  7 {                                                                                                   
  8     char buffe[NUM];                                                                                
  9     memset(buffe,0,sizeof(buffe));                                                                  
 10     char line[4] = "|/-\\";                                                                         
 11     int num = current*100/total;                                                                    
 12     for(int i = 0;i < num;i++)                                                                      
 13     {                                                                                               
 14         buffe[i] = STYLE;                                                                           
 15     }                                                                                               
 16     double rate = current*100/total;                                                                
 17     static int cnt = 0;                                                                             
 18     cnt%=3;                                                                                         
 19     printf("[%-100s][%.1lf%%][%c]\r",buffe,rate,line[cnt]);                                         
 20     cnt++;                                                                                          
 21     fflush(stdout);                                                                                                                                                                                          
 22 }                        

1.memset:初始化buffe

2.\r:是回车,回到该行的第一行在进行输入,如果第一行有数据的话,那么输出上去的就会把原有的给覆盖掉。

3.fflush(stdout):

不加fflush就是全缓冲,全缓冲就是缓冲区写满自然就会打印了,然后一般来说,计算机都是非常快的,所以写满就是一下的事情,所以看起来就是刚刚现象了(光标迅速一个一个进行打印)

"缓冲区写满后的"自然打印""是不是就是体现在显示屏上的光标一个一个地打印

加了fflush的,则就是直接把缓冲区的内容直接搬上显示器进行显示

相关推荐
翼龙云_cloud7 分钟前
阿里云渠道商:如何使用弹性伸缩来实现计算资源的弹性配置?
服务器·阿里云·云计算
05大叔37 分钟前
大事件Day02
运维·服务器
五仁火烧1 小时前
Vue3 项目的默认端口行为
服务器·vue.js·nginx·容器·vue
C Yu小白1 小时前
Linux系统调用与文件操作详解
linux·运维·服务器
ZFB00011 小时前
【麒麟桌面系统】V10-SP1 2503 系统知识——常见用户组简介
linux·运维·kylin
acrelgxy1 小时前
告别被动抢修与盲目巡检!安科瑞运维云平台,让电力系统实现预测性守护。
运维·电力监控系统·智能电力仪表
EndingCoder2 小时前
类的继承和多态
linux·运维·前端·javascript·ubuntu·typescript
Anyexyz2 小时前
【更新】境内 Docker 镜像状态监控——配置生成,一键复制!
运维·docker·容器
信创天地2 小时前
深耕金融政务核心场景:国产化数据库迁移的全流程架构设计与风险管控
运维·网络安全·系统架构·系统安全·运维开发
ZFB00012 小时前
【麒麟桌面系统】V10-SP1 2503 系统知识——添加用户
linux·运维·kylin