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…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...