Linux系统编程学习 NO.8 ——make和Makefile、进度条程序
前言
今天是1024程序员节,不知不觉离第一次写博客已经过去了一年了。在此祝各位程序员不写bug,不再秃头。
make和Makefile
什么是make和Makefile?
make和Makefile是软件开发时所用到的工具和文件。make是一个指令工具。Makefile是一个当前目录下的文件。make和Makefile可以提高我们在Linux下的开发效率。
简单演示
下面用一份c代码来进行演示。

在当前目录下新建一个Makefile文件,并写上相应的依赖关系与依赖方法。

接着使用一下make指令。

依赖关系和依赖方法的解释
这里使用一个生活中的例子来解释依赖关系和依赖方法。现在已经是10月23日了,月底来了,相信不少同学的钱包也已经见底了。这是该怎么办呢?当然是打电话给你的老爸要生活费。找老爸要生活费这一行为也需要对应的依赖关系和依赖方法。你打一个电话过去说,“爹啊,月底了我没钱了,你给我的xx上转1500元当做生活费。”。此时,这你打电话给你爹,首先声明的是依赖关系,要到生活费的前提必须是他是你爹。毕竟你总不能打电话给你舍友的爹要生活费吧。那么往你手机上转账的行为就是对应的依赖方法。你要生活费总不能只给你爹说,“爹啊!”。你只声明依赖关系却没有依赖方法,你的老爹也不会给你转账的。
make会自动推导Makefile的依赖关系
下面我写一个稍微复杂一点的场景来演示make自动推导Makefile的依赖关系。


上面的依赖关系的代码顺序可以随意交换,但是依赖关系的逻辑关系不能缺失,否则make无法自动推导依赖关系。
make的默认动作
make将文件的第一个依赖方法和依赖方法设置成为make指令的默认动作。

.PHONY
为什么make了之后不能接着make呢?

这是因为操作系统为了提高编译效率而是实现的机制。由于你的源文件的生成时间是大于可执行性程序的生成时间的。此时make就不会编译你的源文件。如果你修改了源文件,此时你的源文件的生成时间是小于你的可执行程序的。故make会生成新的可执行程序。

那么它是如何实现按的呢?这里需要引出一个概念即,一个文件的时间属性。一个文件的时间属性分为三种, Access时间(最近被访问时间)、Modify时间(修改时间)、Change时间(改变时间)。 几乎你对文件的任何操作都会修该Access时间。在介绍Modify时间和Change时间前,在这里再次提及一个概念。文件本质等于文件的内容加文件的属性。这里的Modify时间显示的是最近一次文件内容被修改的时间。而Change时间则表示最近一次文件属性被修改的时间。这里介绍一个指令stat,用于查看文件状态。
stat 文件名


为什么最近访问时间没有变呢?其实早期的linux系统的最近访问时间实惠随着你的操作而实时更新的。后来由于处于对性能的优化,最近访问时间不会随着访问而修改。因为文件是存储在磁盘上的,而磁盘属于外部设备。它的访问效率是比较低的,为了进一步优化性能所以最近访问时间默认情况下不会随着被访问而修改。那么我想要让他修改呢?那就是用touch命令。

只要修改源文件的最近修改时间,make就就可以通过依赖关系来进行在次编译。

所以make的对于是否可以再次编译的条件是源文件的最近修改时间小于可执行程序的最近修改时间。
如果我希望每次编译都执行呢?需要在Makefile文件中加入.PHONY来修饰,使它总是被执行。

但是这种写法并不好,因为有时候我们的一些编译问题还是需要我们手动清理后再编译才能解决的。这里建议.PHONY来修饰clean。
特殊符号
由于每次都要手写gcc命令比较麻烦,可以尝试使用特殊符号来代替对应的可执行程序和源文件。

这里的$@可以替换成的是:左边的内容, $^ 可以替换成:右边的内容。
在对应的方法前加上@符号可以不回显指令的内容。

进度条程序
经过了一段时间的Linux操作系统的学习,下面就带着大家用一个简单进度条程序来练练手吧。
前言
回车和换行的概念
这里需要提前知道一个概念,即回车和换行的概念。c语言中的’\n’就可以同时实现回车和换行的操作,但是它还有别的功能,且听为等会讲述。换行大家一定不会陌生,就是从一行跳转到下一行,c语言中,\n表示换行+回车(注:c语言没有单独换行的转义字符)。回车表示将光标移动到文档的开头,在c语言中,\r表示回车。
这里我举一个生活中的例子,在19/20世纪的欧洲,一些上层阶级往往会有当时比较潮流的科技设备,打字机。

在打字机上编写文字时,纸张是不断向上走的。这其实就是一个换行。每写一行文字,就需要手动将印章挪到每行的开头,这其实就是回车。
缓冲区的概念
下面我直接用代码举例

sleep函数是一个系统调用接口。当执行这个函数时,会休眠n秒。那么上面的代码输出结果是什么呢?答案是会先在显示器上打印hello linux,随后下一行休眠了一秒钟又输出了bash命令行。

如果不带上\n呢?结果会是什么呢?答案是当程序执行时,第一秒钟休眠了,随后在下一行中hello linux于bash同时输出在了一行。

这究竟是为什么呢?我相信在大家初步c语言学习的时候,一定听过一个概念就是c语言三大结构之一的顺序结构。代码是从main函数自上而下依次被执行的。那为什么是先休眠后输出呢?因为在sleep期间,程序的数据被暂时保存起来了。保存它的地方就是缓冲区。在这里进需要记住一个简单的概念,即缓冲区是一段被c语言所维护的内存空间。
下面介绍如何强制刷新缓冲区,使我们对应的printf语句先被执行。c程序默认会为用户打开三个输入输出流,标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。这里介绍一个函数fflush(),它接受一个文件流stream,会强制刷新这个流,使得缓冲区内的数据立刻被写到文件中(补充:Linux下一切皆文件,也包括显示器)。

实现一个进度条程序
10秒倒计时小程序
简单写一个10秒倒计时程序来为进度条程序做一个铺垫。

这里我就简单说一下程序的实现思路,当程序在屏幕上输出数字时,我们需要让它立刻被刷新出来并写入显示器文件。随后休眠一秒后,又会在显示上一个数字的位置,用上一个数字-1的值将它覆盖。因为使用了\r回车转义字符。这里的%-2d其实是输出格式控制。
进度条程序简易版
这里实现采取定义与生命分离的方式进行。这里创建三个文件,分别用于声明方法和实现方法以及测试方法。

先简单配置一下Makefile文件。

这里的:右边有两个.c文件,不过$^还是会默认带上这两个.c文件。.PHONY修饰clean表示该指令总是被执行。
第二步,在头文件中包含相关头文件以及声明函数方法。

第三步,实现进度条程序。定义一个字符串数组存储进度条的输出样式,为了让精度条执行时,有一个相应的动画效果。开辟一个数组来存储进度条的内容样式,通过循环来控制进度条在屏幕上的显示。每次回车打印完内容后将进度条的添加进度条内容,搭配上usleep就能达到控制进度条的速度。



进阶版进度条
下面以模拟下载软件时的场景,带大家看一个关于回调函数版本进度条的实现。
首先,我们对原来的processbar.c进行一个修改。

使用回调函数的设计思路将进度条模块独立成回调函数,当下载时,download函数内部控制具体的进度条逻辑。主函数中只需要传一个回调函数就能使进度条跑起来。

相关文章:
Linux系统编程学习 NO.8 ——make和Makefile、进度条程序
前言 今天是1024程序员节,不知不觉离第一次写博客已经过去了一年了。在此祝各位程序员不写bug,不再秃头。 make和Makefile 什么是make和Makefile? make和Makefile是软件开发时所用到的工具和文件。make是一个指令工具。Makefile是一个当前…...
elementUI 中 date-picker 的使用的坑(vue3)
目录 1. 英文显示2. format 与 value-format 无效3. date-picker 时间范围4. 小结 1. 英文显示 <el-date-pickerv-model"dateValue"type"date"placeholder"选择日期"></el-date-picker>解决方案: 引用 zhCn <script&g…...
1-07 React配置postcss-px-to-viewport
React配置postcss-px-to-viewport 移动端适配 安装依赖:在项目根目录下运行以下命令安装所需的依赖包: npm install postcss-px-to-viewport --save-dev配置代码 const path require(path);module.exports {webpack: {alias: {: path.resolve(__di…...
ITSource 分享 第3期【在线个人网盘】
项目介绍 本期给大家介绍一个在线个人网盘 系统. 可以上传,下载,分享文件。 一 业务介绍 本系统分为以下几个模块: 1.登录注册 除了账号密码登录,如果配置了qq邮箱配置的话,还支持qq一键授权登录。 2.首页大盘 首页是个人网盘…...
【C#进阶】C#语法中一些常用知识点总结
文章目录 1.三目运算符2.循环控制语句 (for while do…while foreach)3.访问修饰符4.静态方法和非静态方法5.数组、字典和其他集合类型1. 数组(Array)2. 列表(List)3. 字典(Dictionary)4. 队列(…...
加速开发容错量子计算应用!PsiQuantum官宣将在英国干大事
(图片来源:网络) 在STFC-PsiQuantum的新研发实验室PsiDaresbury正式揭幕时,PsiQuantum宣布,在国家安全战略投资基金(NSSIF)的支持下,已与STFC的Hartree中心合作开展一个为期12个月的…...
使用canvas做了一个最简单的网页版画板,5分钟学会
画板实现的效果:可以切换画笔的粗细,颜色,还可以使用橡皮擦,还可以清除画布,然后将画的内容保存下载成一张图片: 具体用到的canvas功能有:画笔的粗细调整lineWidth,开始一个新的画笔…...
自组织映射Python实现
自组织映射(Self-organizing map)Python实现。仅供学习。 #!/usr/bin/env python3""" Self-organizing map """from math import expimport toolzimport numpy as np import numpy.linalg as LAfrom sklearn.base import…...
如何避免阿里云对象储存OSS被盗刷
网站app图片的云端存储离不开对象存储oss,而最难为的问题就是app做的出名了,少不了同行的攻击,包含ddos,cc攻击以及oss外链被盗刷! 防盗链功能通过设置Referer白名单以及是否允许空Referer,限制仅白名单中的域名可以访…...
产品研发团队协作神器!10款提效工具大盘点!
在如今科技驱动的时代,产品研发团队面临着前所未有的竞争压力和不断变化的市场需求。为了在这个激烈的环境中脱颖而出,团队需要高效协作并充分利用先进的工具来提高生产力和创新能力。 本文将为你盘点产品研发团队协作必备的10个提效工具,这…...
LSTM 与 GRU
RNN无法处理长距离依赖问题,通俗点就是不能处理一些较长的序列数据,那么今天就来介绍一下两个能处理长距离依赖问题地RNN变种结构,LSTM和GRU。 1. LSTM(Long short-term memory) 1.1 LSTM结构 上左图是普通RNN结构图…...
代码评审CheckList
代码评审CheckList Author: histonevonzohomail.com Date: 2023/10/24 此博客为笔者在工作中总结的经验,适用于笔者所在的工作,具体情况还需各位自己分析以下的分类并不规范,有好的建议可以给我Email值此1024祝全世界的开发者:天天…...
[尚硅谷React笔记]——第5章 React 路由
目录: 对SPA应用的理解对路由的理解前端路由原理路由的基本使用路由组件与一般组件NavLink的使用封装NavLink组件Switch的使用解决样式丢失问题路由的模糊匹配与严格匹配Redirect的使用嵌套路由向路由组件传递params参数向路由组件传递search参数.向路由组件传递st…...
如何去掉不够优雅的IF-ELSE
不够优雅的IF-ELSE: 在一个方法中根据两个参数的不同值组合来返回四种可能的类型,你可以使用条件语句,例如 if-else 语句或 switch 语句,来实现这个逻辑。以下是一个示例,假设你有两个参数 param1 和 param2ÿ…...
Python中defaultdict的使用
文章目录 Python 中的 defaultdict 与 dictPython 中的 defaultdict Python 中 defaultdict 的有用函数Python 中的 defaultdict.clear()Python 中的 defaultdict.copy()Python 中的 defaultdict.default_factory()Python 中的 defaultdict.get(key, default value) 今天的文章…...
【ccc3.8】虚拟列表
一个简单的虚拟列表,没有任何其他东西。 原理就是向上滚动时,将下面离开屏幕的那一个item塞到上侧来: 主代码仅有两个:ScrollList对应的滚动容器,ScrollListItem对应单项的预制体 当前支持两种:竖向滚动、…...
【23种设计模式】单一职责原则
个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…...
DNS入门学习:什么是TTL值?如何设置合适的TTL值?
TTL值是域名解析中的一个重要参数,TTL值设置的合理与否对于域名解析的效率和准确性有着非常重要的影响,因此对于网站管理者而言,了解什么是TTL值以及如何设置合理的TTL值对于做好域名解析管理,确保网站的安全稳定运行至关重要。 …...
ilr normalize isometric log-ratio transformation
visium_heart/st_snRNAseq/05_colocalization/create_niches_ct.R at 5b30c7e497e06688a8448afd8d069d2fa70ebcd2 saezlab/visium_heart (github.com) 更多内容,关注微信:生信小博士 The ILR (Isometric Log-Ratio) transformation is used in the anal…...
el表单的简单查询方法
预期效果 实现表单页面根据groupid 、type 、errortype进行数据过滤 实现 第一步,在页面中添加输入或者是下拉框,并且用相应的v-model进行绑定 <div style"display: flex;flex-direction: row;"><el-input style"width: auto…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
