• Linux 学习笔记——make原理补充,进度条


    传统艺能😎

    小编是双非本科大一菜鸟不赘述,欢迎大佬指点江山(QQ:1319365055)
    此前博客点我!点我!请搜索博主 【知晓天空之蓝】

    🎉🎉非科班转码社区诚邀您入驻🎉🎉
    小伙伴们,打码路上一路向北,背后烟火,彼岸之前皆是疾苦
    一个人的单打独斗不如一群人的砥砺前行
    这是我和梦想合伙人组建的社区,诚邀各位有志之士的加入!!
    社区用户好文均加精(“标兵”文章字数2000+加精,“达人”文章字数1500+加精)
    直达: 社区链接点我

    🎉🎉🎉倾力打造转码社区微信公众号🎉🎉🎉
    在这里插入图片描述


    make 原理🤔

    上次我们说到当一个命令被 .PHONY 后面修饰时,他的意思是总是被执行的,即无论目标文件是否新旧忽略对比时间,照样直接执行的关系。

    那么问题来了,Makefile 是如何知道当前文件的新旧的呢?答:根据对比源文件和可执行文件的修改时间来进行判断是否需要就行程序生成。在时间轴上编译器逻辑上会认为 test.c 的源文件的时间戳会在可执行程序 test 的前面才是理所当然的,一旦有修改的动作,该时间戳就会刷新导致源文件时间戳超前,此时 make 就会自动开始 gcc -o 的重新生成。

    我们可以利用 stat 指令查看 Makefile 的 inode 内容,这个 inode 包含了文件的元信息,比如:id,字节数,权限以及三个时间戳:
    在这里插入图片描述

    这里的" 更改 “是 modify ,代表内容的更改,” 改动 "是 change ,代表着属性的改动, 一般更改和改动在 Linux 内核中是低频的,但是访问却是高频的,所以 Linux 对于访问会在次数累积到一定标准后才更新时间戳。所以 make 是否需要重新生成就是看后两者的前后对比。

    缓冲区🤔

    缓冲区本质就是一段内存空间,我们口中的刷新策略就是马上将内存中的空间显示出来,能体会到缓冲区的存在吗?比如给出一个代码:

    int main()
    {
    printf("hai hai hai!\n");
    sleep(2);//休眠2s
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    按照所有代码的逻辑都是从上到下执行的,但是很明显结果书橱时会是先休眠 2s 再打印,其实本质上 printf 早就执行完了,只是 Linux 会在程序终止后才输出借结果罢了,那么从执行完到程序终止这段时间这个结果保存在哪里呢?没错,就是缓冲区

    换行?回车?🤔

    敲黑板辣家人们,换行 ≠ 回车!

    回车是光标回到当前行的最开始,而换行是新起一行,其实 C 语言里的 \n 他包含了回车和换行,Linux 中我们回车+换行采用 \r 实现,比如一个简单的倒计时小程序,他的原理就是输入数字后光标回到最开始继续覆盖写入:

    int main()
    {
       int num = 9;
         while(num)
        {
            printf("%d\r",num--);
            sleep(1);
        }
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    但是执行结果却没有显示?不要忘了此时代码还在缓冲区里边儿蹲着,没关系我们有 fflush 指令,将内容从缓冲区调到 buff ,加到 printf 指令后面就行:

    fflush(stdout);
    
    • 1

    这样一个简单的倒计时指令就 ok 了,根据这个思路我们甚至可以搞一个进度条玩玩:

    #include
    #include
    #include
    
    #define NUM 101
    #define STYLE '#'
    
    void process()
    {
       char pic[NUM];
       memset(pic,'\0',sizeof(pic));
       const char* label = "/-|-\\";//别忘了最后的转义字符
       int count = 0;
       while(count<=100)
       {
         printf("[%-100s][%d%%]..[%c]\r",pic,count,label[count%4]);
         fflush(stdout);
         pic[count++] = STYLE;
         usleep(20000);//参数为微秒(10^-6)的睡眠
       }
       printf("\n");
    }
    
    
    int main()
    {
    process();
    return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    aqa 芭蕾 eqe 亏内,代表着开心代表着快乐,ok 了家人们。

  • 相关阅读:
    回溯算法题目
    Acwing 828. 模拟栈
    【项目】基于C++11实现的数据库连接池
    OSCP系列靶场-Esay-Moneybox保姆级
    Linux-提高CPU、内存使用率shell脚本
    【思考总结】数列收敛和级数收敛的联系与区别【概念辨析】
    C到C++的升级
    每天五分钟机器学习:如何根据ROC曲线计算AUC?
    ros创建工作空间和功能包
    java培训Lock接口里的实现方法
  • 原文地址:https://blog.csdn.net/qq_61500888/article/details/126226010