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的,则就是直接把缓冲区的内容直接搬上显示器进行显示

相关推荐
无敌小茶19 分钟前
Linux学习笔记之环境变量
linux·笔记
Harbor Lau32 分钟前
Linux常用中间件命令大全
linux·运维·中间件
漫谈网络1 小时前
基于 Netmiko 的网络设备自动化操作
运维·自动化·netdevops·netmiko
꧁坚持很酷꧂1 小时前
Linux Ubuntu18.04下安装Qt Craeator 5.12.9(图文详解)
linux·运维·qt
凉、介2 小时前
PCI 总线学习笔记(五)
android·linux·笔记·学习·pcie·pci
电鱼智能的电小鱼2 小时前
EFISH-SBC-RK3588无人机地面基准站项目
linux·网络·嵌入式硬件·机器人·无人机·边缘计算
电鱼智能的电小鱼2 小时前
基于 EFISH-SBC-RK3588 的无人机环境感知与数据采集方案
linux·网络·嵌入式硬件·数码相机·无人机·边缘计算
小诸葛的博客3 小时前
详解Linux中的定时任务管理工具crond
linux·运维·chrome
一默19913 小时前
CentOS 7.9升级OpenSSH到9.9p2
linux·运维·centos
keep intensify3 小时前
Linux常用指令
linux·服务器·php