【Linux】 开发工具(Makefile、git、cgdb)解析与对于操作系统的基础认识


目录

前言

[Part1. Makefile](#Part1. Makefile)

[Part1.1. 基础语法](#Part1.1. 基础语法)

[Part1.2. .PHONY](#Part1.2. .PHONY)

[Part1.3. Make增量编译原理](#Part1.3. Make增量编译原理)

[Part1.4. 多文件递归编译示例](#Part1.4. 多文件递归编译示例)

[Part1.5. Makefile变量](#Part1.5. Makefile变量)

[Part1.6. 内置函数](#Part1.6. 内置函数)

[Part1.7. 模式规则](#Part1.7. 模式规则)

[Part1.8. 完整模板](#Part1.8. 完整模板)

[Part2. C语言缓冲区原理](#Part2. C语言缓冲区原理)

[Part3. Git常用基础命令](#Part3. Git常用基础命令)

[Part4. cgdb调试器](#Part4. cgdb调试器)

[Part5. 操作系统基础理解](#Part5. 操作系统基础理解)

[Part5.1. 为什么需要内存](#Part5.1. 为什么需要内存)

[Part5.2. 数据流动](#Part5.2. 数据流动)

[Part5.3. 操作系统四大核心功能](#Part5.3. 操作系统四大核心功能)

[Part5.4. 内核态、用户态](#Part5.4. 内核态、用户态)

[Part5.5. 操作系统对数据的管理](#Part5.5. 操作系统对数据的管理)

[Part6. 结语](#Part6. 结语)


前言

对于开发工具的熟练使用和Linux操作系统的理解是非常重要的,来跟随小编的视角来看看吧。


let's go!!!!!!!!


Part1. Makefile

Part1.1. 基础语法

cpp 复制代码
目标: 依赖
    命令
示例:
code: code.c
    gcc -o code code.c

**逻辑:**如果code.c修改过,则执行gcc编译,生成可执行文件code。


Part1.2. .PHONY

cpp 复制代码
.PHONY: clean
clean:
    rm -f code

<1> .PHONY声明这是伪目标 直接执行命令

**<2> 执行清理:**make clean


Part1.3. Make增量编译原理

make依靠文件修改时间戳判断要不要执行规则:

<1>依赖文件更新时间 > 目标文件更新时间:执行编译。

<2> 依赖没有改动,多次make:输出nothing to be done,不会重复编译

<3>touch filename修改文件的三个时间戳可以欺骗make,强制触发编译


Part1.4. 多文件递归编译示例

cpp 复制代码
A:A.o
    gcc A.o -o A

A.o:A.s
    gcc -c A.s -o A.o

A.s:A.c
    gcc -E A.c -o A.s

make自上而下扫描递归解析依赖一层层生成中间文件


Part1.5. Makefile变量

cpp 复制代码
B = code
test:
    echo $(B)

**•**取值语法:$(变量名)

自动化变量各个变量含义:

<1>****$@ 当前规则的目标

<2>****$^ 全部依赖文件列表

<3>****$< 第一个依赖文件

**命令前加@:**执行命令,不在终端打印这条shell命令。

cpp 复制代码
例:@echo "linking $^ -> $@"

Part1.6. 内置函数

**<1>**wildcard:匹配一批文件

cpp 复制代码
SRC := $(wildcard *.c)

Part1.7. 模式规则

cpp 复制代码
%.o:%.c
    $(CC) $(CFLAGS) -c $< -o $@
//含义:任意.o,由同名.c编译生成。

Part1.8. 完整模板

cpp 复制代码
BIN = app
SRC = $(wildcard *.c)
OBJ = $(SRC:.c=.o)
CC = gcc

$(BIN): $(OBJ)
    $(CC) -o $@ $^

%.o:%.c
    $(CC) -c $< 

.PHONY:clean
clean:
    rm -f $(BIN) $(OBJ)

Part2. C语言缓冲区原理

<1>行缓冲:标准输出stdout是行缓冲,遇到\n换行才刷新缓冲区打印到屏幕

cpp 复制代码
printf("hello");
sleep(3);
// 不会立刻打印,sleep结束才输出

printf("hello\n");
sleep(3);
// \n触发刷新,立刻打印

<2>fflush(stdout)强制刷新缓冲区,不需要换行,直接输出内容


<3> 格式化输出对齐

%xd:右对齐,占x字符宽度

%-xd:左对齐,占x字符宽度


Part3. Git常用基础命令

<1>git add .# 将所有修改加入暂存区

<2>git status# 查看仓库当前状态

<3>git commit -m "提交描述"# 暂存区提交到本地仓库

<4>git push# 推送到远程仓库

<5>git clone 远程仓库地址# 克隆远程仓库到本地

**p.s.**暂存区:可以多次修改,多次add,统一一次commit、push。


Part4. cgdb调试器

cpp 复制代码
gcc -g test.c -o test
cgdb test

GDB常用指令表

>>指令功能

q****退出gdb

l****列出源代码

l 行号****从指定行展示源码

b 行号****设置断点

b main****在main函数打断点

r****运行程序

c****继续运行,到下一个断点停下

n 单步****跳过函数调用

s 单步****进入函数内部

bt****打印函数调用栈backtrace

finish****跑完当前函数,返回调用处

p 变量名****打印变量值

info b****查看全部断点信息

disable 断点编号****临时禁用断点

enable 断点编号****启用断点

until 行号****直接运行到指定行停下

display 变量****持续监视变量,每次暂停自动打印

undisplay 编号****取消监视

info locals****打印当前函数所有局部变量

watch 变量****变量被修改,程序自动停下

set var x=y****gdb内部修改变量的值

condition 断点号 条件****条件断点,满足条件才停


Part5. 操作系统基础理解

Part5.1. 为什么需要内存

CPU只能直接读写内存,不能直接读写磁盘。

磁盘速度很慢,CPU运算速度极快**;**内存作为中间高速缓存,用来匹配CPU和外设的速度差距。

程序运行过程:

<1> 可执行文件存放在磁盘。

<2> 运行程序,操作系统把程序加载到内存

<3>CPU从内存读取指令、数据执行


Part5.2. 数据流动

磁盘 → 内存 → CPU运算 → 内存 → 网卡(输出外设),发给对方

对方网卡接收,放入内存处理,最后写入磁盘保存**。**

所有外设都不和CPU直接打交道,数据必经内存中转**。**


Part5.3. 操作系统四大核心功能

**<1>**进程管理

**<2>**内存管理

**<3>**文件管理

**<4>**驱动设备管理


Part5.4. 内核态、用户态

应用程序跑在用户态,不能直接访问硬件、内存、设备

• 想要操作硬件,必须调用系统调用陷入内核态,由操作系统内核完成硬件操作。

高内聚低耦合上层应用只调用接口,底层驱动封装硬件细节


Part5.5. 操作系统对数据的管理

操作系统把各式各样来自硬件的数据,统一抽象成数据结构,完成增删查改

通过结构体描述管理对象**(进程PCB、文件描述符等),保存元信息,完成管理。**


Part6. 结语

这篇文章我们认识到了Linux开发工具和操作系统的相关知识,接下来,小编还会带来更多Linux相关的知识,敬请期待~
最后,祝大家可以:春风得意马蹄疾,一日看尽长安花!

最后的最后,要是觉得本文还可以的话,可以点点赞,关注小编一波,谢谢大家!~

相关推荐
kk”7 小时前
Linux的组和权限管理
linux·运维·服务器
mohesashou8 小时前
红帽linux的K8S部署
linux·kubernetes·ansible
xiaoye-duck9 小时前
《Linux网络编程》UDP Socket 编程实战:从 Echo 回显、通用字典服务到套接字封装全流程
linux·网络·udp
夏至春来-美美10 小时前
git clone报错
git
孙克旭_10 小时前
Docker 镜像构建|Vue+SpringBoot+Go 多语言项目 Dockerfile 案例
linux·运维·vue.js·spring boot·docker·dockerfile
life码农10 小时前
Linux截取Nginx指定时间段日志的三种方法(grep/awk/sed)
linux·nginx
Dawn-bit11 小时前
Linux网络进阶:TCP三次握手和四次挥手与TCP连接状态
linux·服务器·网络·tcp/ip·云计算·智能路由器
NJCloud12 小时前
MooseFS 分布式存储部署与高可用架构实践
linux·运维·分布式·架构