文章目录
【Linux】vim gcc makefile
前言
一、Linux 编辑器 - vim
0. 简介
1. 多模式切换
2. 各模式常见指令操作
二、gcc 使用
三、项目自动化构建工具 - make/Makefile
1. 简介
2. 语法
# 目标文件 : 依赖文件列表(一整行称为依赖关系)
# 依赖方法
proc:proc.c
gcc -o proc proc.c
3. 特性
proc:proc.c
gcc -o proc proc.c
4. 综合案例 - 进度条
4.1 预备知识
4.2 代码实现
#include <stdio.h>
#include <unistd.h>
int main()
{
int count = 10;
while(count >= 0)
{
printf("%-2d\r", count); // \r回车,但是没有换行,也就没有刷新
fflush(stdout);
count--;
sleep(1);
}
printf("\n"); //换行,防止命令行提示符覆盖掉最后的0
return 0;
}
process:main.c process.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f process
// --- process.h --- //
#pragma once
void FlushProcess(double total, double current);
// --- process.c --- //
#include "process.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <string.h>
#define NUM 101 //预留100个插入空间,剩下一个给‘/0’
#define STYLE '='
#define POINT '.'
#define SPACE ' '
const int pnum = 6;
// version 2:真实的进度条,应该根据具体的比如下载的量,来动态刷新进度
void FlushProcess(double total, double current)
{
// 1. 更新当前进度的百分比
double rate = (current/total)*100;
// 2. 更新进度条主体
char bar[NUM]; // 我们认为,1% 更新一个等号
memset(bar, '\0', sizeof(bar)); //全部设置为\0,如有新内容插入就直接覆盖
// 可以使得printf打印完插入的内容就停止打印
for(int i = 0; i < (int)rate; i++)
{
bar[i] = STYLE;
}
// 3. 更新旋转光标或者是其他风格
static int num = 0;
num++;
num %= pnum; // %= 控制始终为 pnum长度的光标循环
char points[pnum+1];
memset(points, '\0', sizeof(points));
for(int i = 0; i < pnum; i++)
{
if(i < num) points[i] = POINT;
else points[i] = SPACE;
}
// 4. test && printf
//单行动态显示 + 预留空间显示
printf("[%-100s][%.1lf%%]%s\r", bar, rate, points);
fflush(stdout);
//sleep(1);
}
// --- main.c --- //
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include "process.h"
typedef void (*flush_t)(double total, double current);// 这是一个刷新的函数指针类型
const int base = 100;
double total = 2048.0; // 2048MB
double once = 0.1; // 0.5MB
// 进度条的调用方式
void download(flush_t f)
{
double current = 0.0;
while(current < total)
{
// 模拟下载行为
int r = rand() % base + 1; // [1, 10]
double speed = r * once;
current += speed;
if(current >= total) current = total;
usleep(10000);
// 更新除了本次新的下载量
// 根据真实的应用场景,进行动态刷新
//Process(total, 1.0);
f(total, current);
//printf("test: %.1lf/%.1lf\r", current, total);
//fflush(stdout);
}
printf("\n");
}
int main()
{
srand(time(NULL));
download(FlushProcess);
return 0;
}