- 博客(68)
- 收藏
- 关注

原创 个人博客声明
这里,是我学习的痕迹,也是我们共同成长的空间,希望通过这个博客与更多志同道合的朋友们一起学习和进步。知识的分享应当建立在尊重与理解之上,如果我的博客中无意间使用了你的原创内容或者您发现博客中有任何内容侵犯了您的权益,我重视知识产权和版权保护问题,收到通知后我会在第一时间进行删除或修正。在这个博客里,我将不定期分享我在学习过程中遇到的各种有趣的技术点、代码片段、图片资料以及有价值的文档。
2024-07-03 19:45:38
610
22
原创 028 动静态库 —— 动态库
本文介绍了Linux动态库(.so)的制作与使用。首先详细讲解了动态库制作流程:编写头文件声明接口、实现源文件并编译为位置无关码(-fPIC)、链接生成.so文件(-shared)。通过一个数学库demo演示了从代码编写到生成动态库的全过程,包括测试程序的编译与运行注意事项。文中特别强调了-fPIC的作用,解释了位置无关码对动态库共享机制的重要性。最后对比了静态库与动态库的特性差异,并剖析了动态库加载原理——通过内存映射机制实现多进程共享同一份代码。文章还提供了解决动态库加载失败的常见方法,如设置LD_LI
2025-08-16 16:13:49
637
原创 027 动静态库 —— 静态库
本文介绍了Linux系统中动静态库的基本概念和制作方法,重点聚焦于静态库的实现原理与实战应用。文章首先从操作系统层面解析了文件打开的核心机制,包括4KB页缓存原理、局部性优化和内存管理架构。随后详细演示了静态库的制作流程: 通过gcc编译生成目标文件(.o) 使用ar工具打包成静态库(.a) 组织标准的库文件目录结构 文中提供了完整的静态库开发示例,包含: 头文件设计(接口声明) 源文件实现(四则运算函数) 全局错误码处理机制 Makefile自动化构建脚本 最后解释了静态库与动态库的本质区别,以及如何在实
2025-08-16 16:10:27
433
原创 026 inode 与软硬链接
摘要:Linux inode 与软硬链接解析 本文深入探讨了 Linux 系统中 inode 与软硬链接的核心机制。 软链接(符号链接)本质是存储目标路径的快捷方式,具有独立 inode,支持跨分区和目录引用,但源文件删除会导致链接断裂。其典型应用包括环境配置切换和多版本管理。 硬链接则是通过不同文件名共享同一 inode,不能跨分区或用于目录,删除任一链接不影响数据,仅当链接计数归零才会释放存储。 关键对比: 软链接以路径引用,硬链接直接绑定 inode 内核禁止目录硬链接以防止循环结构,而 . 和 ..
2025-08-16 16:05:32
496
原创 025 理解文件系统
这篇文章主要介绍了磁盘和文件系统的基本概念与工作原理。首先通过多个视频和文章链接讲解了磁盘和磁带的结构、存储原理以及机械硬盘的工作方式。随后引用《操作系统概念精要》和《鸟哥的Linux私房菜》的内容,详细说明磁盘的物理组成(盘片、磁头、扇区等)、分区表类型(MBR和GPT)以及文件系统的特性。重点阐述了文件系统中超级区块、inode和数据区块的作用:超级区块记录整体信息,inode存储文件属性和数据块位置,数据区块保存实际文件内容。这种设计通过inode快速定位数据块,提高了文件读写效率。文章还提到现代分区
2025-08-16 15:58:20
775
1
原创 024 基础 IO —— 缓冲区
本文探讨了缓冲区的核心作用及其实现原理。缓冲区通过将多次小数据操作聚集成大数据块统一输出,减少系统调用次数,提高I/O效率。C语言标准库提供三种缓冲模式:无缓冲(如stderr)、行缓冲(如stdout)和全缓冲(如文件流),分别适用于不同场景。缓冲区刷新时机包括遇到换行符、缓冲区满、手动调用fflush或程序退出时。缓冲区位于用户态内存,由标准库维护,而内核还提供系统级缓冲区进一步优化I/O性能。现代编程语言通过流式封装(如C++的iostream)隐藏了缓冲区管理细节,使开发者能专注于业务逻辑。缓冲区与
2025-08-16 15:34:43
577
原创 023 基础 IO —— 重定向
摘要 本文详细介绍了Linux中的重定向机制及其实现原理。重定向本质是通过修改文件描述符(FD)指向,改变标准输入/输出/错误流的默认终端目标。文章解析了常见重定向符号(>、>>、<)的作用,并重点讲解了dup2系统调用的用法,通过代码示例演示了如何将printf输出重定向到文件。此外,还展示了重定向在minishell中的实际应用场景,为理解Linux I/O重定向提供了实践指导。文章内容涵盖文件描述符操作、系统调用实现原理和实际应用案例。
2025-08-16 15:31:31
651
原创 022 基础 IO —— 文件
本文介绍了C语言文件I/O操作的基础知识,重点讲解了文件的基本概念、两种状态(打开和未打开)以及操作系统如何管理打开的文件。文章详细汇总了C语言常用的文件操作函数,包括文件打开与关闭(fopen、fclose)、字符与字符串读写(fputc、fgets等)、格式化读写(fprintf、fscanf)、二进制文件读写(fwrite、fread)以及文件定位与状态函数(fseek、ftell等)。通过函数表格形式展示了参数、返回值、功能描述和注意事项,为开发者提供了实用的文件操作参考。
2025-08-16 15:26:27
878
原创 021 多语言协同执行(了解)
本文介绍了在Linux系统编程中如何使用fork()和exec()函数实现跨语言程序调用。fork()创建子进程后,通过exec()执行外部程序,保持进程ID不变但替换映像。文中提供了C程序调用Python脚本和C++程序的具体示例,展示了多语言协同执行的过程。常见问题包括路径错误和忘记等待子进程等。该方法灵活性强,可用于构建脚本执行平台或任务处理器,实现不同语言程序间的调度与控制。
2025-07-14 19:28:24
784
原创 020 实现一个简易 Shell
本文介绍了如何从零实现一个简易的Shell,主要包括以下内容: Shell的基本功能:包括提示符显示、命令读取与解析、内置命令执行、重定向支持、环境变量管理和退出机制。 关键实现步骤: 使用getenv()和getcwd()获取用户信息和工作目录 通过strtok分割命令行参数 区分内置命令(cd/export/echo)和外部命令 使用fork+execvp执行外部程序 增强ls命令自动添加颜色选项 技术要点: 提示符格式化为[user@host dir]# 内置命令直接处理不需fork 环境变量通过pu
2025-07-14 19:26:33
434
原创 019 进程控制 —— 进程程序替换
进程程序替换解析 进程程序替换是指利用系统调用将当前进程的代码和数据替换为新程序内容,保持原进程PID不变。关键点包括: 替换后原进程代码立即终止,从新程序main开始执行 文件描述符默认关闭(除非标记FD_CLOEXEC) 常用exec函数族: execl:参数列表方式,需指定绝对路径 execv:参数数组方式 execlp/execvp:自动搜索PATH环境变量 execle/execve:可自定义环境变量 典型应用模式: 单进程替换:直接调用exec函数 多进程替换:fork子进程后执行替换,不影响父
2025-07-14 19:16:29
694
原创 018 进程控制 —— 进程等待
进程等待的必要性与方法 进程等待是父进程回收子进程资源、获取子进程退出状态的关键机制。若不等待会导致: 僵尸进程累积,占用系统资源 无法获取子进程执行结果 常用方法: wait():阻塞等待任意子进程 waitpid():可指定PID,支持非阻塞模式(WNOHANG) 关键要点: 通过status参数解析退出状态(正常/异常) WNOHANG选项实现非阻塞轮询 使用宏(WIFEXITED/WEXITSTATUS)解析状态码 实验示例展示了两种等待方式的应用场景和返回值处理。
2025-07-14 19:11:29
930
原创 017 进程控制 —— 终止进程
进程控制与终止摘要 进程终止分为正常退出和异常退出两大类。正常退出包括代码执行完毕(结果正确/不正确)和主动调用退出函数;异常退出则包括收到终止信号或出现错误(如段错误)。进程通过退出码向操作系统报告状态:0表示成功,非0值表示错误类型。 关键退出方法: exit():执行清理操作后退出 _exit():立即终止,不做清理 return:从main函数返回退出码 系统通过errno记录错误码,strerror()可将其转换为错误信息。信号终止的进程退出码为128+信号编号。理解进程退出机制有助于调试和系统编
2025-07-14 19:06:27
587
原创 016 进程控制 —— 进程创建
本文介绍了Linux进程控制中的fork()函数及其应用。主要内容包括: fork()的基础用法:创建子进程,父子进程共享代码段,采用写时拷贝(COW)机制共享数据段,修改时才会真正复制。 代码示例: 基础fork()使用展示父子进程执行流程 循环创建多个子进程的实现方法 父子进程的资源共享与独立性 常见问题: fork()失败原因分析 避免子进程成为僵尸进程的方法 父子进程共享的资源说明 进阶用法: 父子进程分工协作 链式创建进程 文章通过代码示例和运行结果,直观展示了fork()的工作原理和实际应用场景
2025-07-14 19:02:01
851
原创 015 程序地址空间入门
程序地址空间摘要 程序地址空间是操作系统为每个程序分配的内存区域,包含多个功能不同的段: 内核空间(0xC0000000以上):操作系统专用,用户程序无法访问。 栈区:存放函数调用信息、局部变量,向低地址增长。 堆区:动态分配内存,向高地址增长。 数据段:存放已初始化全局/静态变量。 BSS段:存放未初始化全局/静态变量,自动初始化为0。 代码段:存放程序指令,具有只读属性。 内存映射段:包含共享库、文件映射等。 关键特点: 32位系统用户空间3GB,64位系统可达128TB 栈和堆增长方向相反,中间有保护
2025-07-14 18:42:46
701
原创 014 Linux 2.6内核进程调度队列(了解)
Linux 2.6内核的O(1)调度器解析 Linux 2.6内核引入的O(1)调度器通过多级优先级队列实现高效进程调度。其核心设计包括: 双队列结构:每个CPU维护活跃数组(运行进程)和过期数组(耗尽时间片进程),通过周期性交换角色保证公平性。 优先级划分:0~99级为实时进程(优先调度),100~139级为普通进程,时间片随优先级动态调整。 优化机制:动态提升交互式进程优先级,惩罚CPU密集型任务;多核环境下采用独立队列和负载均衡减少竞争。 特点:调度时间复杂度恒定为O(1),但存在调优复杂等问题,最终
2025-06-23 19:23:41
1061
原创 013 环境变量
环境变量简介 环境变量是操作系统中存储配置信息的动态键值对,由名称和值组成。它们分为用户环境变量(仅对当前用户生效)、系统环境变量(全局生效)和临时环境变量(仅在当前会话有效)。常见环境变量包括PATH(执行文件搜索路径)、HOME(用户根目录)、USER(当前用户名)等。查看环境变量可使用echo、printenv等命令。自定义程序需手动添加路径到PATH变量才能直接执行,方法包括临时设置(export命令)或永久生效(修改shell配置文件如.bashrc)。理解环境变量有助于管理系统配置和程序运行环境
2025-06-23 19:22:16
589
原创 012 进程状态和优先级
Linux进程状态与优先级解析:进程状态包括R(运行)、S(可中断睡眠)、D(不可中断睡眠)、T(停止)、Z(僵尸)和X(死亡),其中僵尸进程需父进程回收资源。通过ps或top命令查看进程状态,STAT字段显示进程当前状态及附加属性(如s表示会话首领、+表示前台进程)。进程生命周期涵盖创建、就绪、运行、阻塞、终止等阶段,状态间可通过调度或外部事件转换。理解进程状态对系统管理和问题排查至关重要。
2025-06-23 19:19:29
697
原创 011 Linux进程
Linux进程管理核心解析 进程管理是操作系统核心功能,Linux采用"先描述再组织"哲学: 本质:通过PCB(进程控制块,即task_struct)描述进程所有属性,再通过数据结构组织管理 关键结构:task_struct包含进程PID、状态、优先级、内存指针、上下文数据等数百个字段 管理方式:类比学校档案系统,通过增删查改数据结构实现对进程的创建、调度和终止 状态查看:常用命令包括静态查看的ps和动态监控的top/htop 进程=用户代码+内核数据结构,内核通过维护task_stru
2025-06-23 19:15:49
1200
原创 010 冯・诺依曼体系结构和操作系统
操作系统是计算机系统中的一个基本程序集合,它负责管理计算机的硬件和软件资源,并为用户程序提供一个稳定、高效、安全的执行环境。进程管理:负责控制和调度进程,确保每个程序能在系统中正常运行。内存管理:管理计算机的内存,确保各程序的内存使用不发生冲突。文件管理:提供文件的存储、读取、删除等基本操作,并确保数据的安全性。驱动管理:与硬件设备进行交互,管理硬件设备的驱动程序。
2025-06-23 19:13:28
724
原创 009 进度条的实现
本文介绍了Linux下进度条的实现过程,从基础版本逐步优化,最终形成一个可维护的完整进度条程序。内容涵盖: 基础实现:使用循环打印百分比,添加进度条显示 改进优化:加入加载动画,控制进度条长度 代码重构:通过文件链接方式组织代码(processBar.h/.c/main.c) 细节完善:解决尾部符号显示问题,优化可维护性 配套工具:提供两种makefile配置方案 最终版本实现了动态进度展示、百分比计数、加载动画和尾部符号优化的完整进度条,采用模块化设计便于维护。适合Linux初学者学习基础UI实现和代码组
2025-06-23 19:11:00
734
原创 008 Linux 开发工具(下) —— make、Makefile、git和gdb
make在Makefile中,我们可以定义变量来简化重复的代码。CC = gccCC:定义编译器为gcc。CFLAGS:定义编译选项为-Wall -O2。
2025-06-23 19:07:55
1389
原创 007 Linux 开发工具(上)—— vim、解放sudo、gc+
可重定位目标文件通常以 .o结尾(Windows 上是.obj机器指令(Machine Instructions):程序的可执行代码,但未指定最终内存地址。符号表(Symbol Table):记录函数、变量等符号,供链接器解析。重定位信息(Relocation Information):用于在链接时调整地址。节(Section)结构:比如.text(代码段)、.data(已初始化数据段)、.bss(未初始化数据段)等。这些文件是“可重定位”的,因为它们的地址信息尚未固定,而是由链接器。
2025-05-07 19:09:09
1492
原创 006 yum和Linux生态
1. 软件包和软件包管理器的关系软件包(Package):就像 Windows 下的安装程序一样,软件包是已经编译好的软件,通常包含了可执行程序、配置文件、依赖关系和其他必要的资源。用户只需要通过简单的命令就可以将它们安装到系统中。软件包一般是针对特定操作系统或发行版(如 CentOS、Ubuntu 等)预编译的。软件包管理器(Package Manager):它就像是“应用商店”,提供一个方便的接口让用户可以搜索、安装、更新和删除软件包。
2025-05-07 19:06:59
1014
原创 005 权限的理解
操作类型普通用户能否执行root 用户能否执行执行成功/失败chmod修改权限只能修改自己拥有的文件可以修改任何文件普通用户成功:文件属于自己;chown修改拥有者只能修改自己拥有的文件可以修改任何文件普通用户成功:文件属于自己;chgrp修改所属组只能修改自己拥有的文件可以修改任何文件普通用户成功:文件属于自己;file目录权限:可读权限(r:是否可以列出该目录中的文件。没有r权限,即使有x权限,也无法执行ls或查看目录中的内容。可写权限(w。
2025-05-07 19:03:40
803
原创 004 Linux基本指令
指令本质:用户输入字符串 → Shell 解析 → 执行对应可执行文件。文件抽象哲学:硬件、数据、操作均通过文件接口统一管理(Linux 中的一切皆文件用户隔离设计:Shell 作为安全屏障,防止直接内核操作引发系统风险。操作习惯善用历史命令提升效率。理解环境变量配置优化工作流。
2025-05-07 18:57:25
1166
原创 003 系统和入门指令
Linux 提供了一系列强大的命令帮助用户管理文件和目录。理解这些命令的功能及使用场景,将极大提高操作效率。本文介绍了一些基本的命令,它们包括文件和目录的查看、管理、删除命令以及路径的操作方式。掌握这些命令是使用 Linux 系统的基础,并为更高级的操作奠定了基础。
2025-05-07 18:46:47
1017
原创 002 创建普通账户(为朋友创建、删除账户)
创建用户:使用命令创建新用户。设置密码:使用命令为用户设置密码。删除用户:使用命令删除用户及其相关文件。
2025-05-07 18:43:35
826
原创 001 环境搭建
Linux 的开源特性使得各种 Linux 发行版层出不穷。Debian: 以稳定性著称,适合用于服务器环境。它拥有庞大的社区支持和丰富的软件包资源,适合需要长期稳定支持的用户。Ubuntu: 基于 Debian,用户友好,易于安装和使用。Ubuntu 广泛应用于个人计算和云计算领域,尤其适合 Linux 初学者。红帽企业级 Linux (RHEL): 针对企业环境设计,提供商业级支持。RHEL 适用于对安全性和稳定性要求较高的企业。CentOS。
2025-05-07 18:40:49
633
原创 【C/C++】区分0、NULL和nullptr
虽然他们三者区别并不大,但是,在一些特殊情况还是需要进行区分使用的。0:C/C++98中,既可表示整数值,也可表示空指针,但可能产生混淆。NULL:通过宏定义来表示空指针,虽然提高了可读性,但依然可能与整型0混淆。nullptr:C++11引入,明确表示空指针,解决了0和NULL的问题,推荐使用。在现代C++中,优先使用nullptr来表示空指针,确保代码更安全和清晰。
2025-01-31 16:59:59
1112
原创 【C++】类与对象(下)
匿名对象是没有名字的临时对象。当函数返回一个对象时,C++会创建一个匿名对象来接收返回值。用作表达式的操作数时,编译器会创建一个临时对象。在类型转换过程中,C++会临时创建匿名对象。特性匿名对象有名对象命名没有名称,仅为临时对象有名称,可以通过变量名访问生命周期短暂,仅在表达式或函数调用期间存在生命周期由作用域决定,作用域结束时销毁访问方式不能直接访问,通常仅在当前表达式中使用可以通过名称多次访问内存管理编译器自动管理内存,通常是栈上分配可以是栈上或堆上,需要显式管理堆对象的内存应用场景。
2025-01-31 16:54:34
1174
原创 【C++】类与对象(中)
内置类型(如intchar默认构造函数不会初始化内置类型成员,成员变量可能是随机值。int x;// 默认值是随机的解决方法:使用 C++11 提供的默认值:int x = 0;// 默认值为 0自定义类型(如classstruct编译器生成的默认构造函数会调用这些类型成员的默认构造函数。public:Inner()cout << "Inner 构造函数" << endl;Inner obj;// 自定义类型成员int main()Outer obj;// 实例化自定义类型成员。
2025-01-31 16:48:02
1287
原创 【C++】类与对象(上篇)
类的定义class是定义类的关键字。类是对象的蓝图,包含成员变量(属性)和成员函数(方法)。类定义语法// 成员变量// 成员函数class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。两种定义方式在类体中定义成员函数:这样的函数可能被编译器视为inline内联函数。类声明与定义分离:通常将类的声明放在.h文件中,成员函数的定义放在.cpp文件中。
2024-09-23 10:01:00
1498
51
原创 【C++】class详解(与struct对比讲解)
在C++中,class都struct可以用于定义自定义的数据类型,并且它们在很多方面都是相似的。然而,它们之间的主要区别体现在默认的访问权限以及编程习惯上。接下来我将详细讲解这两者的区别、实现以及常见的易错点,辅以多个代码示例。// struct 示例int a;// 默认 publicvoid show() { // 默认 public// class 示例int a;// 默认 privatepublic:void setA(int val) { // public 明确指定。
2024-09-23 09:57:31
1460
11
原创 【C++】内联函数(inline function)详解
内联函数是一种建议编译器在调用函数时,不使用普通的函数调用机制(如压栈、跳转等),而是将函数体直接嵌入到调用点。它的优点是可以减少函数调用的开销,特别是对于频繁调用的小函数。以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,以提升程序运行的效率。语法inline内联函数适合短小且频繁调用的函数,避免了宏定义的副作用,具有类型检查和调试功能。编译器有最终决策权,不一定会根据inline关键字做内联优化,特别是在函数较大或较复杂时。
2024-09-21 17:08:26
991
10
原创 【C++】关键字auto详解
C++中的auto关键字用于自动推导变量的类型,它大大简化了代码书写,尤其是在变量类型复杂或冗长时。以下是关于auto关键字的详细讲解,包括其使用细则、不能推导的场景、以及基于循环中的应用范围。在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,可以思考下为什么?C++11中,标准委员会赋予了autoauto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
2024-09-21 17:07:52
8249
4
原创 【C++】深入理解引用:从基础到进阶详解
C++中的引用(reference)是一个非常重要的概念,它可以让你创建一个变量的别名,直接操作原始变量而不需要复制。引用在函数参数传递、返回值和效率优化等方面有广泛的应用。下面我们会一步步讲解引用的各个知识点,并搭配上由易到难的代码示例来帮助深入理解。引用的主要作用是在函数传参和返回值中减少不必要的复制操作,提高程序的运行效率。const引用是非常灵活和常用的,能够接收多种类型的对象,包括字面量和临时对象,广泛用于保证数据不被修改。注意生命周期和局部变量引用问题,避免程序指向无效内存。权限控制。
2024-09-17 16:12:34
1568
28
原创 【C/C++】程序的构建(编译)过程概述
每个语言和环境都有其特定的构建和执行流程,但大多数都会涉及某种形式的处理,将源代码转换成机器可以直接理解的形式。在编译和构建一个 C/C++ 程序的过程中,通常会经过预处理编译汇编和链接这四个阶段,这个过程被称为构建流程或者编译流程。每个阶段都负责将代码从一个形式转换为下一个形式,最终生成可执行文件。下面我会以一个简单的C/C++程序详细讲解每个阶段的具体过程。注意:编译器的工作其实非常复杂,远远不是博主我这轻描淡写的两句话就能描述清楚的!想要深入了解,还需不断钻研!!!
2024-09-17 12:29:18
2009
13
原创 【C++】函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是谁也赢不了!,后者是谁也赢不了!在C++中,允许在同一作用域中声明几个功能类似的同名函数函数重载(Function Overloading)是指在同一个域中,可以定义多个函数名相同但参数列表不同的函数。是函数的一种特殊情况,编译器通过参数的类型、顺序和数量来区分不同的重载函数,而不仅仅是通过函数名。
2024-09-17 12:28:08
844
3
原创 【C++】缺省(默认)参数
参数参数(默认参数)是C++中的一个强大功能,允许简化我们的函数调用,减少重复代码。当参数的默认值满足大多数情况下的需求时,它可以大幅提升代码的吸引力,全缺省和半缺省的区别在于函数调用的灵活性与复杂性,全缺省更为简单,而半缺省提供了更多的可控性。与typedef比较中,参数注重于函数接口的设计,而typedef着眼于简化类型声明。两者都有适用的场景,但都致力于提升代码的简洁性和可维护性。合理地运用这两者,可以帮助开发者编写更高效且简洁的代码。
2024-09-16 12:03:03
1159
15
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人