Linux基础-Makefile的编写、以及编写第一个Linux步调:进度条(模仿在 方便 ...

打印 上一主题 下一主题

主题 660|帖子 660|积分 1980

目录
一、Linux项目自动化构建工具-make/Makefile
​编辑
配景:
makefile小本领:
二、Linux第一个小步调-进度条
先导:
1.怎样利用/r,fflush(stdout)来实现我们想要的效果;
2.写一个倒计时:
进度条:
version1:一个普通的进度条
version2:详细的应用场景,模仿下载软件
version3:在未来,方便下载的同时,更新图形化界面
代码:version3:
processbar.c:
processbar.h:
Main.c:


进度条完整代码在文章末尾
一、Linux项目自动化构建工具-make/Makefile

   如图:让我们简单的来看一下makefile具有什么功能
  你可以随意创建一个可运行的代码
  

  在Makefile中
  1. mytest:test.c
  2.     gcc -o mytest test.c
  3. .PHONY:clean
  4. clean:
  5.     rm -f mytest
复制代码


  然后:
  

  makefile是一个文件,make是一个命令。
  配景:

   1.会不会写makefile,从一个侧面分析了一个人是否具备完成大型工程的能力
2.一个工程中的源文件不计数,其按范例、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件必要先编译,哪些文件必要后编译,哪些文件必要重新编译,甚至于举行更复杂的功能操作
3.makefile带来的好处就是——“自动化编译”,一旦写好,只必要一个make命令,整个工程完全自动编译,极大的提高了软件开辟的效率。
4.make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
5.make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
    依赖关系:
  $表现:取内容 
  code.exe依赖于code.c
  $@---目标文件
  $^----整个依赖文件列表
  

  注意:在makefile内的注释是#
  

  如图:我们在makefile中这样写到
  1. code.exe:code.o
  2.     gcc code.o -o code.exe
  3. code.o:code.s
  4.     gcc -c code.s -o code.o
  5. code.s:code.i
  6.     gcc -S code.i -o code.s
  7. code.i:code.c
  8.     gcc -E code.c -o code.i
  9. .PHONY:clean
  10. clean:
  11.     rm -f code.i code.s code.o code.exe
复制代码
makefile从上往下识别,而识别到code.o时,code.o并不存在,就不会执行该命令,继续往下识别,知道识别到code.c时,执行code.c的命令,再倒序执行。
  肯定要把最终需形成的文件放置开头
  

  

    makefile小本领:

  makefile支持变量:
  

  在执行步调时,隐蔽命令
  

  在使用makefile时,依赖方法只能有一行吗?可以有多行
  

  

  我们不想表现这些命令:
  

  

  
二、Linux第一个小步调-进度条

   \r&&\n
回车概念
换行概念
老式打字机的例子
  我们键盘上的Enter键就相当于回车+换行 \r\n
  

    先导:

  1.怎样利用/r,fflush(stdout)来实现我们想要的效果;

  
  如图:我在test.c和makefile文件中写入这样的代码
  打印后步调休眠3s,结束步调
  

  test.c:
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     printf("hello zz,hello world...\n");
  5.     return 0;
  6. }
复制代码
makefile:
  1. bin=test.exe
  2. src=test.c
  3. $(bin):$(src)
  4.     @gcc -o $@ $^
  5.     @echo "complier &(src) to &(bin)..."
  6. .PHONY:clean
  7. clean:
  8.     @rm -f $(bin)
  9.     @echo "clean project..."
复制代码
同上:
  

  3s后再打印,步调退出同时,打印。(未打印时,不代表步调没执行,只是放于缓冲区了)
  

  提问:printf和sleep哪个函数先运行?printf先运行,由于执行代码是从上至下。
  一般只有缓冲区满的时间,步调结束的时间,才会刷新缓冲区,因此在这里我们用到fflush函数强制刷新。
  

  查阅手册:
  

  修改代码后:
  

  2.写一个倒计时:

   
  在test.c中写到:
  1. #include<stdio.h>
  2. #include<unistd.h>
  3. int main()
  4. {
  5.     int cnt = 10;
  6.     while(cnt >= 0)
  7.     {
  8.         printf("%d\r",cnt);
  9.         fflush(stdout);
  10.         --cnt;
  11.         sleep(1);
  12.     }
  13.     printf("\n");
  14.     return 0;
  15. }
复制代码
实际上当我们运行步调时,会出现一个问题,明明打印的是10 - 0,但是,却酿成从10、90、80....
  这是因为,打印在表现器上的都是字符,当10时是两个字符,而当变为9后,只有一个字符,0无法被覆盖,则会不停被打印,办理办法:%2d
  执行这个代码后,就会直接覆盖两个字符。
  1. #include<stdio.h>
  2. #include<unistd.h>
  3. int main()
  4. {
  5.     int cnt = 10;
  6.     while(cnt >= 0)
  7.     {
  8.         printf("倒计时: %2d\r",cnt);
  9.         fflush(stdout);
  10.         --cnt;
  11.         sleep(1);
  12.     }
  13.     printf("\n");
  14.     return 0;
  15. }
复制代码

进度条:

   version1:一个普通的进度条

  processbar--processbar.c--processbar.h--Main.c
  

  然后在makefile中写到:
  

  1. processbar:Main.c processbar.c
  2.    gcc -o $@ $^
  3. .PHONY:clean
  4. clean:
  5.    rm -f processbar   
复制代码
processbar.c--processbar.h--Main.c分别写到:
  processbar.c--processbar.h--Main.c

  processbar.c:
  1.    #include"processbar.h"                                                                                                         
  2.    #include<string.h>                                                                                                         
  3.    #include<unistd.h>                                                                                                         
  4.                                                                                                             
  5.    #define Length 101                                                                                                         
  6.    #define Style '#'                                                                                                         
  7.    const char *lable = "|/-\";                                                                                                         
  8.    void Procbar()                                                                                                         
  9.    {                                                                                                                                 
  10.     char bar[Length];                                                                                                         
  11.     memset(bar,'\0',sizeof(bar));                                                                                                         
  12.     int len = strlen(lable);                                                                                                                              
  13.     int cnt = 0;                                                                                                         
  14.     while(cnt <= 100)                                                                                                         
  15.     {                                                                                                         
  16.       printf("[%-100s][%2d%%][%c]\r",bar,cnt,lable[cnt%len]);  
  17.       fllush(stdout);                                                                             
  18.       bar[cnt++] = Style;                                                                                               
  19.       usleep(50000);                                                                                                               
  20.     }                                                                                                                        
  21.     printf("\n");                                                                                             
  22.   }                                                                                                                        
  23.          
复制代码

  usleep,相当于原来sleep的10^-6,因此在这里代表将本来的100s缩短为5s完成
  之后会输出这样的结果:

  当然这样还不敷完美:
   version2:详细的应用场景,模仿下载软件

  在Main.c

  
  1. #include"processbar.h"
  2. #include<unistd.h>
  3. //download
  4. void download()
  5. {
  6.   double filesize = 100*1024*1024;//100M
  7.   double current = 0.0;
  8.   double bandwidth = 1024*1024*1.0;
  9.   printf("download begin,current: %lf\n",current);
  10.   while(current <= filesize)
  11.   {
  12.     Procbar(filesize,current);
  13.     //从网络中获取数据
  14.     current += bandwidth;
  15.     usleep(50000);
  16.   }
  17.   printf("\ndownload done, filesize:%lf\n",filesize);
  18. }
  19. int main()
  20. {
  21. //Procbar(100.0,56.9);
  22. //Procbar(100.0,1.0);
  23. //Procbar(100.0,99.9);
  24. //Procbar(100.0,100);
  25.   download();
  26.   return 0;
  27. }
复制代码
在processbar.c中:
  1. #include"processbar.h"
  2. #include<string.h>
  3. #include<unistd.h>
  4. #define Length 101
  5. #define Style '#'
  6. const char *lable = "|/-\";
  7. void Procbar(double total,double current)
  8. {
  9.   char bar[Length];
  10.   memset(bar,'\0',sizeof(bar));
  11.   int len = strlen(lable);
  12.   int cnt = 0;
  13.   double rate = (current * 100.0)/total;
  14.   int loop_count = (int)rate;
  15.   while(cnt <= loop_count)
  16.   {
  17.     printf("[%-100s][%.1lf%%][%c]\r",bar,rate,lable[cnt%len]);
  18.     fflush(stdout);
  19.     bar[cnt++] = Style;
  20.   }
  21.     printf("\n");
  22. }
复制代码
这样却是一行一行的输出:
  

  着实是因为
  

  最后:
  

  更优processbar.c代码:
  

  1. #include"processbar.h"
  2. #include<string.h>
  3. #include<unistd.h>
  4. #define Length 101
  5. #define Style '#'
  6. const char *lable = "|/-\";
  7. void Procbar(double total,double current)
  8. {
  9.   char bar[Length];
  10.   memset(bar,'\0',sizeof(bar));
  11.   int len = strlen(lable);
  12.   int cnt = 0;
  13.   double rate = (current * 100.0)/total;
  14.   int loop_count = (int)rate;
  15.   while(cnt <= loop_count)
  16.   {
  17.    // printf("[%-100s][%.1f%][%c]\r",bar,rate,lable[cnt%len]);
  18.    // fflush(stdout);
  19.     bar[cnt++] = Style;
  20.   }
  21.     printf("[%-100s][%.1f%][%c]\r",bar,rate,lable[cnt%len]);
  22.     fflush(stdout);
  23. }
复制代码
version3:在未来,方便下载的同时,更新图形化界面

  

  Main.c:
  1. #include"processbar.h"
  2. #include<unistd.h>
  3. //download
  4. void download(callback_t cb)
  5. {
  6.   double filesize = 100*1024*1024;//100M
  7.   double current = 0.0;
  8.   double bandwidth = 1024*1024*1.0;
  9.   printf("download begin,current: %lf\n",current);
  10.   while(current <= filesize)
  11.   {
  12.     cb(filesize,current);
  13.     //从网络中获取数据
  14.     current += bandwidth;
  15.     usleep(50000);
  16.   }
  17.   printf("\ndownload done, filesize:%lf\n",filesize);
  18. }
  19. int main()
  20. {
  21. //Procbar(100.0,56.9);
  22. //Procbar(100.0,1.0);
  23. //Procbar(100.0,99.9);
  24. //Procbar(100.0,100);
  25.   download(Procbar);
  26.   return 0;
  27. }
复制代码
processbar.h:
  1. #pragma once
  2. #include<stdio.h>
  3. #include<unistd.h>
  4. //void Procbar();
  5. typedef void(*callback_t)(double ,double );
  6. void Procbar(double total,double current);
复制代码
再更新
  

  1. #include"processbar.h"
  2. #include<unistd.h>
  3. double bandwidth = 1024*1024*1.0;
  4. //download
  5. void download(double filesize,callback_t cb)
  6. {
  7.   //double filesize = 100*1024*1024;//100M
  8.   double current = 0.0;
  9.   printf("download begin,current: %lf\n",current);
  10.   while(current <= filesize)
  11.   {
  12.     cb(filesize,current);
  13.     //从网络中获取数据
  14.     current += bandwidth;
  15.     usleep(50000);
  16.   }
  17.   printf("\ndownload done, filesize:%lf\n",filesize);
  18. }
  19. int main()
  20. {
  21. //Procbar(100.0,56.9);
  22. //Procbar(100.0,1.0);
  23. //Procbar(100.0,99.9);
  24. //Procbar(100.0,100);
  25.   download(100*1024*1024,Procbar);
  26.   download(10*1024*1024,Procbar);
  27.   download(99*1024*1024,Procbar);
  28.   download(900*1024*1024,Procbar);
  29.   return 0;
  30. }
复制代码
最后:
  

  
代码:version3:

processbar.c:

  1. #include"processbar.h"
  2. #include<string.h>
  3. #include<unistd.h>
  4. #define Length 101
  5. #define Style '#'
  6. const char *lable = "|/-\";
  7. void Procbar(double total,double current)
  8. {
  9.   char bar[Length];
  10.   memset(bar,'\0',sizeof(bar));
  11.   int len = strlen(lable);
  12.   int cnt = 0;
  13.   double rate = (current * 100.0)/total;
  14.   int loop_count = (int)rate;
  15.   while(cnt <= loop_count)
  16.   {
  17.    // printf("[%-100s][%.1f%][%c]\r",bar,rate,lable[cnt%len]);
  18.    // fflush(stdout);
  19.     bar[cnt++] = Style;
  20.   }
  21.     printf("[%-100s][%.1f%][%c]\r",bar,rate,lable[cnt%len]);
  22.     fflush(stdout);
  23. }
复制代码
processbar.h:

  1. #pragma once
  2. #include<stdio.h>
  3. #include<unistd.h>
  4. //void Procbar();
  5. typedef void(*callback_t)(double ,double );
  6. void Procbar(double total,double current);
复制代码
Main.c:

  1. #include"processbar.h"
  2. #include<unistd.h>
  3. double bandwidth = 1024*1024*1.0;
  4. //download
  5. void download(double filesize,callback_t cb)
  6. {
  7.   //double filesize = 100*1024*1024;//100M
  8.   double current = 0.0;
  9.   printf("download begin,current: %lf\n",current);
  10.   while(current <= filesize)
  11.   {
  12.     cb(filesize,current);
  13.     //从网络中获取数据
  14.     current += bandwidth;
  15.     usleep(50000);
  16.   }
  17.   printf("\ndownload done, filesize:%lf\n",filesize);
  18. }
  19. int main()
  20. {
  21. //Procbar(100.0,56.9);
  22. //Procbar(100.0,1.0);
  23. //Procbar(100.0,99.9);
  24. //Procbar(100.0,100);
  25.   download(100*1024*1024,Procbar);
  26.   download(10*1024*1024,Procbar);
  27.   download(99*1024*1024,Procbar);
  28.   download(900*1024*1024,Procbar);
  29.   return 0;
  30. }
复制代码
  结语:
         随着这篇关于题目剖析的博客靠近尾声,我衷心盼望我所分享的内容能为你带来一些开导和帮助。学习和明白的过程往往布满挑战,但正是这些挑战让我们不断成长和进步。我在预备这篇文章时,也深刻领会到了学习与分享的兴趣。
         在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我一连写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开各人的鼓励与指正。因此,如果你在阅读过程中有任何疑问、发起或是发现了文章中的不足之处,都接待你慷慨赐教。         你的每一条反馈都是我进步路上的宝贵财富。同时,我也非常等待可以或许得到你的点赞、收藏,关注这将是对我莫大的支持和鼓励。当然,我更等待的是可以或许一连为你带来有代价的内容,让我们在知识的道路上共同前行

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表