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

相关推荐
A小辣椒7 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒11 小时前
TShark:基础知识
linux
AlfredZhao13 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式