linux:POSIX 线程库 (`pthread`) 详解与多线程编程实践
一、pthread 库概述POSIX 线程 (POSIX Threads),简称 pthread,是 C 语言中实现多线程编程的标准库。它提供了一套丰富的 API,用于创建、同步和管理线程。pthread 库在 Unix、Linux 和 macOS 等系统上广泛支持,是开发高性能并发程序的重要工具。 核心组件 线程管理:创建、终止和等待线程 同步机制:互斥锁 (Mutex)、读写锁、条件变量 线程同步:信号量、屏障 线程特定数据:每个线程独立的数据存储 二、线程的基本操作1. 线程创建与终止pthread_create 函数12int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 参数说明: thread:指向 pthread_t 类型的指针,用于存储新创建线程的 ID attr:线程属性设置,NULL...
linux:从源码视角解析 pthread_cleanup_push 与 pthread_cleanup_pop 的成对出现机制
导言在多线程编程领域,线程资源的正确释放是保障程序稳定性与可靠性的关键环节。pthread_cleanup_push和pthread_cleanup_pop作为线程资源清理的重要机制,其成对出现的要求并非随意设定,而是由底层源码实现逻辑所决定。本文将从源码角度深入剖析这一要求的根本原因,并结合具体代码示例说明其在实际资源管理中的重要性。 一、宏定义的语法约束在多数系统的实现中,pthread_cleanup_push和pthread_cleanup_pop并非以普通函数的形式存在,而是通过宏定义来实现功能。从语法结构上看,很多实现里pthread_cleanup_push会以类似左花括号 “{” 的形式结束,而pthread_cleanup_pop则以类似右花括号 “}”...
信号与线程机制详解:从屏蔽位图到共享独立区域
导言在操作系统的复杂架构体系中,信号与线程作为保障程序高效运行与协同调度的核心机制,其原理与实现对系统性能与稳定性起着决定性作用。信号作为进程间异步通信的关键途径,通过信号屏蔽策略与位图管理机制,构建起进程对外部事件的动态响应体系;线程则以资源共享与独立分配的双重特性,在提升程序并发执行效率的同时,引发数据一致性与资源管理等关键问题。而pthread库作为线程编程的重要工具,为开发者提供了便捷的线程操作接口。深入探究这些核心概念,对于开发高可靠性的系统级软件具有重要理论与实践意义。 一、信号机制详解1.1 信号的定义与作用信号作为一种软件中断机制,承担着进程间异步事件通知的重要功能。操作系统预先定义了丰富的信号类型,例如SIGINT(由用户通过Ctrl + C组合键触发的中断信号)、SIGTERM(用于正常终止进程的信号)等。当特定系统事件发生或执行特定系统调用时,信号将被发送至目标进程,进程根据自身配置的信号处理策略(默认处理、自定义处理函数或忽略)进行响应,从而实现系统层面的事件驱动处理机制。 1.2...
进程与线程中全局变量、变量、函数及主进程的差异剖析
一、基本概念概述1.1 进程进程是操作系统进行资源分配和调度的基本实体,是程序在计算机上的一次动态执行过程。每个进程都拥有独立的虚拟地址空间,包含代码段、数据段、堆和栈等关键区域。这种地址空间的独立性使得进程间天然隔离,单个进程的崩溃通常不会波及其他进程的正常运行。 1.2 线程线程作为进程内的执行单元,构成了程序执行流的最小单位。同一进程内的多个线程共享进程的地址空间与系统资源,如全局变量、打开的文件描述符等。相较于进程切换,线程切换的系统开销更小,这一特性为提升程序的并发处理能力提供了重要支持。 1.3 全局变量全局变量定义于函数体外部,其作用域覆盖整个程序范围,允许程序内的任意函数对其进行访问与修改。在多进程或多线程环境下,全局变量的并发访问管理尤为关键,不当操作极易引发数据一致性问题。 1.4 局部变量局部变量在函数内部声明,其生命周期与作用域均局限于函数体内部。函数执行结束后,存储局部变量的栈空间随即释放。即便不同函数中存在同名局部变量,它们在内存中也对应独立的存储单元。 1.5...
操作系统中断与信号处理
一、中断机制原理与实践中断是操作系统实现紧急事件处理和任务调度的关键机制,通过硬件与软件协同工作,确保系统对各类突发情况的及时响应。 1.1 中断分类中断主要分为硬件中断与软件中断两类。硬件中断由外部硬件设备触发,如键盘、网卡等;软件中断则由程序执行特定指令引发,常见于系统调用场景。 1.2 典型硬件中断流程示例(1)键盘输入中断处理1234567891011121314151617181920212223242526272829/* 按键动作// 当检测到按键按下,键盘硬件电路生成电信号// 键盘控制器将电信号转换为数据并发送中断请求*//* 中断响应// CPU接收中断信号(假设当前运行任务为Task A)// 保存Task A的运行上下文(包括程序计数器PC、寄存器状态等)// 暂停Task A的执行*//* 中断处理// CPU根据中断向量表找到键盘中断对应的服务程序// 执行中断服务程序:// 读取键盘硬件寄存器数据,获取按键扫描码// 将扫描码转换为字符编码*//* 事件传递// 中断服务程序将处理后的键盘事件传递给操作系统//...
Linux:进程间通信技术
一、什么是共享内存?共享内存就像是一块大家都能直接访问的公共黑板,不同的进程可以直接在这块黑板上读写数据。和传统的进程间通信方式相比,共享内存不需要在内核和进程之间反复拷贝数据,大大减少了数据传输的开销。想象一下,传统方式是把资料从一个部门复印一份再送到另一个部门,而共享内存则是让两个部门直接看同一份资料,效率自然高得多。所以,在实时数据处理、数据库缓存、图像处理这些对数据传输速度要求极高的场景中,共享内存就成了开发者们的首选。 二、共享内存是如何工作的?以 Linux 系统为例,常见的共享内存实现方式有System V共享内存和POSIX共享内存,它们各有特点,下面我们分别来看其实现步骤。 1. System V 共享内存创建或获取共享内存段:首先,我们需要用ftok函数生成一个唯一的 “钥匙”(键值),它根据一个已存在的文件路径和一个项目 ID 来生成,这个键值就像进入共享内存房间的钥匙。例如: 123#include <sys/types.h>#include <sys/ipc.h>key_t key = ftok(".",...
Linux 系统监控利器:ps、free、top 指令深度解析
导言在 Linux 系统管理与运维工作中,实时掌握系统运行状态至关重要。ps、free、top这三条指令堪称系统监控的 “黄金三角”,能帮助我们快速获取进程、内存、系统负载等核心信息。本文将通过详细解析指令参数与实战案例,带你深入理解这些工具的使用技巧。 PS 指令FREE 指令TOP 指令一、PS指令1. ps 指令:进程信息的精准探测器ps(Process Status)用于查看系统当前进程状态,根据不同参数组合可实现多样化的信息展示。 1.1 ps -elf:完整详细的进程清单ps -elf以扩展长格式展示所有进程信息,适合全面分析进程运行细节。当执行该指令时,系统会遍历所有进程,并按照以下规则生成输出: 参数解析: -e:等价于-A,其作用是让ps指令遍历系统内核维护的进程表,将其中记录的所有进程都展示出来,确保没有进程被遗漏 。 -l:启用长格式输出模式。在这种模式下,ps不仅会显示基础的进程信息,还会额外获取进程的优先级、进程标志等信息。这些信息有助于管理员更细致地了解进程的资源分配和运行特性。 -f:开启完整格式显示。此时,ps会从进程相关的数据结构中提取...
Linux:为什么用 dup 而不是直接赋值
导言在 C 语言的文件操作和输入输出重定向场景中,我们常常会遇到dup函数,而不是直接对文件描述符进行赋值操作,这背后有着深刻的原因,涉及到操作系统资源管理、文件描述符特性以及程序的健壮性等多个方面。 一、直接赋值与 dup 函数的本质差异1. 直接赋值的局限性在 C 语言中,文件描述符是一个非负整数,用于标识打开的文件。如果尝试对文件描述符进行直接赋值,例如int new_fd = old_fd;,这仅仅是进行了值的拷贝。此时new_fd和old_fd虽然数值相同,但它们相互独立,对其中一个文件描述符进行的操作(如关闭、读写)不会影响另一个。这种简单的赋值无法实现文件描述符的共享和关联,无法满足一些特定场景下对文件操作的需求 。 2. dup 函数的工作原理dup函数的原型为int dup(int...
鸟哥的私房菜:高级文件系统管理
一、软件磁盘阵列 (Software RAID)1.1 RAID 基础概念1.1.1 RAID 定义与目标 全称:Redundant Arrays of Independent Disks(独立容错式磁盘阵列) 核心目标:扩大磁盘容量、实现磁盘容错、提升读写性能 分类:硬件 RAID(独立 RAID 芯片)与软件 RAID(通过 mdadm 软件实现) 1.1.2 常见 RAID 级别对比 RAID 级别 最少磁盘数 容错能力 可用容量 性能特点 适用场景 RAID 0 2 无 n×磁盘容量 读写性能最佳 临时存储、非关键数据 RAID 1 2 n-1 50%磁盘容量 读性能提升,写性能不变 数据备份、高可用性 RAID 10 4 每组 RAID1 容错 50%磁盘容量 高性能 + 高容错 数据库服务器 RAID 5 3 1 (n-1)×磁盘容量 读写性能均衡 企业级存储 RAID 6 4 2 (n-2)×磁盘容量 更强容错,性能略降 关键业务数据 1.2 软件 RAID 实践 (mdadm)1.2.1 创建 RAID 阵列123456#...
鸟哥的私房菜:服务管理与开机流程管理
一、服务管理基础1.1 程序信号与 kill 命令在 Linux 操作系统中,信号(signal)作为进程间通信的重要机制,用于实现对程序运行状态的控制。常见的信号类型包括: SIGHUP(1):触发程序重新加载配置文件,在不中断服务的情况下实现配置更新 SIGINT(2):向进程发送中断请求,功能等同于用户在终端执行 Ctrl+C 操作 SIGKILL(9):强制执行进程终止操作,该信号不可被捕获或忽略 SIGTERM(15):请求进程正常终止,允许程序执行必要的清理工作 SIGSTOP(19):暂停进程的执行,等效于终端操作中的 Ctrl+Z kill 命令作为信号发送的核心工具,其语法结构如下: 12kill -信号 PID # 向指定进程标识符(PID)发送信号killall -信号 程序名 # 向所有匹配程序名的进程实例发送信号 例如,通过执行 kill -1 748 命令,可使 rsyslogd 服务重新加载配置文件,实现动态配置更新。 1.2 systemd 服务管理机制systemd 作为 Linux...
鸟哥的私房菜:软件管理与安装及登录文件初探
一、主流 Linux 软件管理机制目前主流 Linux 发行版使用的软件管理机制主要有两类: 发行版代表 软件管理机制 使用指令 线上升级机制 (指令) Red Hat/Fedora RPM rpm, rpmbuild YUM (yum, dnf) Debian/Ubuntu DPKG dpkg APT (apt-get) RockyLinux RPM rpm, rpmbuild YUM (yum, dnf) 二、RPM 基础概念2.1 RPM 简介 全称:RedHat Package Manager 特点:以数据库记录方式管理软件安装,安装前检查依赖关系 优势: 预编译打包,安装方便 数据库记录软件信息,便于查询、升级和反安装 SRPM:含源代码的 RPM 包,用于自定义修改软件参数 2.2 RPM 软件命名规则以 chrony-4.2-1.el9.rocky.1.0.x86_64.rpm 为例: 12chrony- 4.2- 1. el9.rocky.1.0.x86\_64 ...
Linux:输入输出与文件操作函数学习笔记整理
导言在 C 语言的编程世界里,输入输出以及文件操作是与外界交互、处理数据存储的重要环节。scanf、printf、open、fopen、read、fread、write、fwrite、fseek、lseek、mmap这些函数各司其职,共同构建起强大的数据处理体系。本文将详细介绍这些函数的功能、用法、示例,并进行对比分析。 一、标准输入输出函数:scanf 与 printf1. printf 函数及其变体printf函数是 C 标准输入输出库(stdio.h)中用于格式化输出的函数,其原型为int printf(const char *format, ...)。其中,format是格式控制字符串,包含普通文本和格式说明符;...表示可变参数列表。 123456789#include <stdio.h>int main() { int num = 10; float f = 3.14; char str[] = "Hello, World!"; ...
鸟哥的私房菜:基础设置、备份、文件压缩打包与工作排程
一、网络设定RockyLinux 9 通过 Network Manager 服务管理网络,使用 nmcli 指令配置。 查看网络信息:用 ip link show 查看网络接口,nmcli connection show 查询连接代号。如需重建连接,可执行 nmcli connection delete ens3 和 nmcli connection add con-name ens3 ifname ens3 type ethernet。 关键参数:connection.autoconnect 控制开机自启,ipv4.method 设为 auto 自动获取 IP,设为 manual 则手动配置。 设定 IP:自动获取时,nmcli connection modify ens3 ipv4.method auto 并启用;手动配置示例: 1234567nmcli connection modify ens3 \connection.autoconnect yes \ipv4.method manual \ipv4.addresses 172.16.50.1/16...
鸟哥的私房菜:用户管理与 ACL 权限设置
一、Linux 账号之 UID 与 GID1.1 账号信息存储与 UID/GID 范围Linux 系统通过特定文件记录账号的 UID(用户标识符)与 GID(组标识符)信息。/etc/passwd文件记录 UID,同时也包含 GID 相关信息;/etc/group文件则专门记录 GID 以及组成员信息。 ID 范围 使用者特性 0 系统管理员账号,拥有最高权限 1 - 999 系统账号,用于系统服务运行等,1 - 200 由系统发行版自行建立,201 - 999 可供用户按需创建系统账号 1000 - 60000 普通用户账号,供日常使用 1.2 账号文件结构与解析 /etc/passwd文件:以冒号分隔,包含七个字段,具体含义如下: 账号名称:用户登录系统使用的名称。 密码:早期存储加密密码,现已移至/etc/shadow,此处通常为x。 UID:用户标识符,唯一标识用户。 GID:用户初始群组的 ID。 使用者信息说明栏:可记录用户相关信息,如姓名等。 家目录所在处:用户登录后的默认工作目录。 预设登入时所取得的 shell...
鸟哥的私房菜:正规表示法与 shell script 学习整理
一、正规表示法的理论与实践1.1 grep 指令的应用范式grep 作为基于正规表示法的基础文本搜索工具,通过 grep [选项] 模式 文件名 的语法结构实现文本匹配功能。在系统配置文件检索场景中,命令 grep -n student /etc/passwd 可精准定位包含 "student" 字符串的行,并输出行号信息。面对系统日志数据处理需求,如筛选 dmesg 命令输出的网卡 ens3 相关日志,可采用管道技术结合选项参数实现:dmesg | grep -n -i ens3。此外,-A 与 -B 选项支持上下文信息输出,-v 选项则实现反向匹配,例如 df | grep -v tmpfs 可过滤掉临时文件系统信息,聚焦常规文件系统数据展示。 1.2 正规表示法的符号语义体系正规表示法通过特定元字符构建强大的模式匹配规则: 定位符:^ 匹配行首,$ 匹配行尾,如 grep -n '^#' regular_express.txt 可检索注释行 通配符:. 匹配任意单个字符,\ 用于转义特殊字符 重复限定符:*...
Linux:stat 与 fstat 函数学习笔记
一、函数概述在 UNIX 和 Linux 系统编程中,stat和fstat用于获取文件状态信息,如大小、权限、修改时间等,信息存于struct stat结构体。二者功能相似,但参数类型和使用场景不同,合理使用可提升文件操作效率。 二、函数原型与参数对比 函数 原型 参数说明 stat int stat(const char *pathname, struct stat *statbuf); pathname:文件路径;statbuf:存储信息的结构体指针 fstat int fstat(int fd, struct stat *statbuf); fd:已打开文件描述符;statbuf:存储信息的结构体指针 stat依赖文件路径,适用于文件未打开时;fstat基于文件描述符,需文件已打开。 三、返回值与结构体信息成功返回0,填充struct stat结构体;失败返回-1,设置errno。结构体常见字段包括设备 ID、inode 编号、权限等。 四、核心差异分析4.1 参数类型差异stat用路径名,如stat("example.txt",...
鸟哥的私房菜:bash 指令连续下达与数据流重导向
一、连续指令的下达1.1 指令返回值在 Bash shell 环境中,特殊符号承担着指令执行、变量处理等核心功能。其中,var=${}用于变量替换;var=$( )可嵌入指令执行结果;var=$(( ))实现数学运算;var=" "保留特殊字符功能;var=' '将内容解析为纯文本;反引号 () 与$( )` 功能等效,均用于指令执行并获取结果。 指令执行后的退出状态码(exit status)是评估执行结果的重要指标。依据 Linux 系统规范,当指令正常结束时,其返回值为 0,可通过echo $?获取该状态码。例如,执行不存在的文件路径(如/etc/passwd,此处作为错误输入示例)或指令(如vbirdcommand)时,Bash 将返回非零状态码。通过查阅man bash中关于^exit status的描述,可获取详细的状态码解释。不同指令的退出状态码虽由开发者自定义,但需遵循 Bash 的基本规范。 1.2...
鸟哥的私房菜:认识 bash 基础与系统救援
一、系统与用户的 shell 配置 合法 shell 清单系统支持的合法 shell 列表存储于 /etc/shells 配置文件中。常见类型包括已被替代的 /bin/sh(现多指向 /bin/bash)、Linux 标准默认 shell /bin/bash、集成 C 语言特性的 /bin/tcsh,以及逐步被取代的 /bin/csh。在基础安装的 RockyLinux 训练环境中,该文件内容通常仅包含 bash 与 sh 两项。 默认 shell 查询机制用户账户的默认 shell 配置存储于 /etc/passwd 文件,具体表现为以冒号分隔的第七字段。可通过 cut 命令实现精准提取,例如执行 cut -d: -f1,7 /etc/passwd 指令,即可输出用户名与对应 shell 信息。 shell 切换技术用户可根据需求切换 shell 环境,但不同 shell 在变量定义语法上存在显著差异(如 bash 采用 var='content',csh 使用 set var = 'content')。切换前需确保目标 shell...
鸟哥的私房菜:基础文件系统管理学习笔记
一、认识 Linux 文件系统1.1 磁盘文件名与磁盘分区 物理特性:磁区(Sector)是最小物理存储单元,现代磁盘常见 512 字节与 4K 两种格式。多个磁区在物理上连续排列形成磁柱(Cylinder),磁盘读写以磁柱为单位进行寻址。例如,传统机械硬盘通过磁头沿磁柱移动实现数据读写,固态硬盘则通过闪存芯片的区块管理模拟类似机制。 分区表格式 MSDOS(MBR):磁盘首个磁区包含 446 字节的主要开机区(MBR Boot Code)和 64 字节的分区表。由于仅能记录 4 笔主分区信息,若需更多分区需通过扩展分区实现逻辑分区。其容量上限受限于 32 位地址空间,无法管理超过 2TB 的磁盘。 GPT:使用 34 个 LBA 区块记录分区信息,磁盘末尾 33 个 LBA 作为备份。支持创建 128 个以上分区,突破 2TB 容量限制,且每个分区记录可独立格式化。GPT 还引入 CRC 校验机制,提高分区表的可靠性。 磁盘文件名:实体磁盘文件名遵循 /dev/sd[a-p] 规则(如 /dev/sda 表示第一块 SCSI/SATA 磁盘),虚拟磁盘(如...
鸟哥的私房菜:权限应用、程序观察与基本管理学习笔记
导言 在 Linux 系统的理论研究与工程实践过程中,权限分配机制、程序运行监控及基础管理策略构成了系统安全与资源调度的核心理论体系。深入解析这些关键技术,不仅有助于构建稳固的系统安全防线,还能通过资源的精细化管理提升系统整体运行效能。以下将对这些核心内容展开系统性探讨。 一、权限在目录与文件系统中的作用机制 Linux 系统基于用户身份(所有者、所属组、其他用户)与权限类型(读r、写w、执行x)构建三维权限管理模型。不同文件类型(普通文件、目录文件)权限语义差异显著,影响资源访问与操作。 普通文件权限:读权限允许查看内容;写权限支持内容修改但不包括删除;执行权限赋予运行能力,但需文件内容有效。 目录文件权限:读权限可枚举文件名;写权限能修改目录结构;执行权限决定能否进入目录。 二、程序管理的理论与实践 在 Linux 系统运行中,程序从外部设备加载到内存后成为进程,对进程的监控与调度是系统管理关键。 1. 程序与进程的概念辨析 程序:静态存储于硬盘等介质的二进制文件,无运行时动态特征。 进程:程序执行时,系统将代码、数据及权限载入内存并分配...
Linux:基于 select 的即时聊天程序设计与实现
引言在网络编程的世界里,即时通信是一个核心话题。如何实现一个高效、稳定的聊天系统?本文将通过分析一个基于 select 的即时聊天程序 B 端代码,深入探讨 Unix/Linux 环境下的网络编程技术,包括命名管道、I/O 多路复用和非阻塞 I/O 等核心概念。 一、 整体架构设计 这个即时聊天程序采用客户端 - 客户端 (C2C) 架构,通过命名管道实现两个客户端之间的双向通信。系统结构简洁明了,如下图所示: 12345678+----------------+ +----------------+| 客户端A进程 | | 客户端B进程 || | | || 写入1.pipe |--------------> | 读取1.pipe || | | || 读取2.pipe ...
鸟哥的私房菜:Linux 基础文件权限与基础账号管理读书笔记
在学习 Linux 系统的过程中,文件权限与账号管理是极为重要的基础内容,这部分知识对于理解系统安全机制、实现资源合理分配与管理有着关键作用。下面对“Linux基础文件权限与基础账号管理” 课程内容进行梳理总结。 一、课程整体框架 课程围绕 RockyLinux 9.x 展开 Linux 基础训练,涵盖初次使用、指令列模式、文件管理、vim 使用等多方面内容。本次重点学习的第四课,聚焦于 Linux 基础文件权限与基础账号管理,后续课程还将深入权限应用、程序管理、文件系统管理等进阶内容,形成完整的学习体系。 二、Linux 传统权限 1.权限概念与身份划分Linux 权限旨在保护文件资料,其设置基于用户、群组、其他人三种身份。用户即文件所有者;群组是文件所属的团队;其他人则是不属于用户且未加入群组的账号。以学校借书为例,小老师为使用者,本班同学为群组,隔壁班同学为其他人,清晰展现了不同身份在文件管理中的权限差异。 2.文件权限观察查看指令:使用ls -l或ll可查看文件权限,如ls -ld...
鸟哥的私房菜:Linux文件管理与Vim编辑器进阶教程
一、批量文件创建技术与花括号扩展应用 1.1 多维度参数组合文件创建在 Linux 中,利用花括号{}的扩展功能可高效创建具有规律命名的文件。以在/dev/shm/testing目录下创建 36 个名为mytest_XX_YY_ZZ的文件为例,其中XX为jan,feb,mar,apr,YY为one,two,three,ZZ为a1,b1,c1,可通过以下命令实现: 12mkdir -p /dev/shm/testingtouch /dev/shm/testing/mytest_{jan,feb,mar,apr}_{one,two,three}_{a1,b1,c1} 原理解析:花括号内的参数会被展开为所有可能的组合,等价于执行 3×3×4=36 次touch操作。mkdir -p用于确保目录存在,避免因路径不存在导致错误。 1.2 序列数字文件批量生成若需创建4XXXC001到4XXXC050的 50 个文件,可结合{}与序列生成语法: 12mkdir -p...
鸟哥的私房菜:指令下达行为与基础档案管理
一、date 指令相关操作 显示 “小时:分钟” 格式:执行指令date +%H:%M,即可按照 “小时:分钟” 的格式输出当前时间,如 “15:20” 。其中%H表示 24 小时制的小时数,%M表示分钟数。 date +%s****输出信息:该指令输出的是从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的秒数,也被称为 Unix 时间戳。它常用于时间相关的计算和记录,在编程和系统管理中应用广泛 。 显示两天前的+%Y/%m/%d****格式日期:使用指令date -d "2 days ago" +%Y/%m/%d,-d选项用于指定日期字符串,“2 days ago” 表示两天前,后面的+%Y/%m/%d用于指定输出格式,以 “年 / 月 / 日” 的形式展示日期。 显示 “西元年 - 日 - 月 小时:分钟” 格式:执行指令date +%Y-%d-%m...
鸟哥私房菜:命令初识
计算机与操作系统知识要点解析 在计算机技术不断发展的今天,深入了解计算机组成、操作系统相关知识,对我们更好地使用和探索计算机世界有着重要意义。接下来,就让我们一同深入探讨这些知识要点,这也是对鸟哥的私房菜课后题回答的整理。 计算机概论基础Unix 基础Linux 基础RockyLinux 9 的基本操作一、计算机概论基础 1. 计算机组成的五大单元计算机组成的五大单元分别是运算器、控制器、存储器、输入设备和输出设备。运算器负责算术运算和逻辑运算;控制器是计算机的指挥中心,控制各部件协调工作;存储器用于存储数据和程序;输入设备将外部信息转换为计算机能接受的形式;输出设备则把计算机处理的结果以人们能识别的形式输出。 2. CPU 主要包含的单元CPU 主要包含运算器和控制器这两个单元。运算器执行具体的运算操作,控制器则根据指令的要求,协调和控制计算机各部件的工作,二者协同工作,使得 CPU 能够高效地处理各种任务。 3. I/O bound 与 CPU boundI/O bound 指的是输入 /...
Linux:内存映射实现文件复制详解
导言 在计算机系统的文件处理领域,数据传输效率是衡量程序性能的重要指标。传统文件复制操作依赖于read和write系统调用,这种方式在用户空间与内核空间之间存在多次数据拷贝过程,导致不可忽视的性能损耗。而基于内存映射(mmap)技术的文件复制方案,通过将文件内容直接映射至进程地址空间,有效减少数据拷贝次数,从而显著提升数据处理效率。本文将对一段基于内存映射的 C 语言文件复制代码进行深入分析,详细阐述其实现机制与设计原理。 一、头文件与宏定义123456789#include <sys/mman.h>#include <sys/types.h>#include <fcntl.h>#include <unistd.h>#include <sys/stat.h>#include <stdio.h>#include <stdlib.h>#define ARGS_CHECK(argc, num) if (argc != num) { fprintf(stderr, "Usage:...
Linux:实现目录树结构打印
一、引言:为什么需要实现目录树打印?在系统编程和文件管理场景中,直观展示目录结构是一项基础需求。通过递归遍历目录并以树状结构输出,我们可以: 学习价值:深入理解文件系统操作、递归算法和层级结构的编程实现; 工程实践:为文件管理器、备份工具、磁盘空间分析等程序提供基础功能; 调试辅助:快速查看目录结构,辅助定位文件路径问题。 本文将通过 C 语言实现一个完整的目录树打印程序,涵盖目录遍历、递归处理、树状符号渲染等核心技术点。 二、功能说明:目录树打印程序的核心能力 该程序通过以下功能实现目录结构的可视化: 递归遍历:从指定目录开始,递归扫描所有子目录; 树状渲染:使用├──、└──、│ 等符号构建层级结构; 排序显示:按字母顺序排列目录和文件; 错误处理:包含完整的错误检查和提示机制。 程序运行效果示例: 12345678910projects/├── src/│ ├── main.c│ └── utils/│ ├── string.c│ └── file.c├── include/│ ├── utils.h│ └──...
Linux:文件系统编程函数统计
一、基于 tar 命令的代码压缩技术实践在日常软件开发工作流中,代码文件的压缩归档是一项基础且核心的操作。tar 命令结合 Gzip 压缩算法,是实现高效文件压缩存储的典型解决方案,该方案不仅能够显著减小文件存储体积,同时可完整保留文件目录结构信息。 文件归档与压缩实现通过tar cfvz参数组合,可将所有以test开头的文件及目录打包并压缩为package.tar.gz格式文件,从而实现文件体积的有效缩减,具体命令如下: 1tar cfvz package.tar.gz test* # 归档并压缩 其中,c参数表示创建新的归档文件,f参数用于指定归档文件名,v参数可在操作过程中显示详细执行信息,z参数则启用 Gzip 压缩功能。 压缩文件解包操作使用tar xzvf命令可对已压缩的文件包进行解压缩处理,具体操作指令如下: 1tar xzvf package.tar.gz # 解压缩 二、Vim 文本编辑器核心操作指令解析Vim...
文件系统编程深度解析:从目录流到 IO 多路复用
一、目录流操作与文件系统基础1.目录流核心概念体系目录流是 Linux 文件系统中用于读取目录信息的核心机制,其设计基于 "一切皆文件" 的哲学思想。在 Linux 系统中,目录本质上是一种特殊文件,存储着文件名与 inode 节点的映射关系。目录流操作通过一组系统调用与库函数,实现了对目录内容的遍历与管理。 从系统架构视角看,目录流操作涉及三层关键概念: 系统调用层:用户空间与内核交互的底层接口,如open_dir、read_dir等,直接对应内核文件系统模块的操作 库函数层:对系统调用的封装抽象,如 POSIX 标准定义的opendir()、readdir()等函数 内核结构层:Linux 内核中文件系统相关的数据结构,如inode、dentry等核心结构体 POSIX 标准的形成标志着目录流操作的规范化发展。该标准定义了 26 个与文件系统相关的头文件,确保了 UNIX/Linux 系统间的接口兼容性。而 ISO-C 标准定义的 24 个头文件则提供了更基础的 C...
探秘 Linux 目录流:从概念到实践的深度解析
导言 在 Linux 操作系统的体系架构中,目录流作为文件系统交互的核心组件,承担着目录信息检索与层级结构遍历的关键功能。对于系统开发者与运维工程师而言,深入剖析目录流的理论基础与实践机制,是掌握 Linux 系统编程范式与实现高效系统管理的必要前提。 一、目录流的核心概念 1.1 目录流的定义与作用目录流是一组用于目录信息检索与遍历操作的函数集合,在 Linux 文件系统树形结构的构建与维护中发挥着关键作用。通过目录流接口,用户能够获取目录下的文件与子目录元数据,解析文件属性信息,从而实现对文件系统的精细化操作。该机制广泛应用于文件管理工具开发、数据备份系统构建以及系统监控程序设计等领域。 1.2 系统调用:用户空间与内核的桥梁系统调用作为用户空间与内核交互的唯一标准接口,构成了目录流功能实现的底层支撑体系。当用户空间程序调用目录流相关函数时,通过系统调用机制将请求传递至内核态,由内核完成具体操作并返回执行结果。 在这一过程中,C 标准库与 POSIX...
Linux:类似ls -al的目录列表程序
一、引言 在 Linux 操作系统生态中,ls - l命令作为文件系统目录信息检索的核心工具,能够以列表形式结构化呈现文件及目录的详细元数据信息,在系统管理、软件开发、运维保障等场景中具有不可替代的作用。通过自主开发具备类似功能的程序,有助于深入理解文件系统接口规范、系统调用机制及 C 语言在底层编程中的应用范式。本文提出的directory_lister.c程序,旨在通过 C 语言编程实现ls - l命令的核心功能,为相关领域的学术研究与工程实践提供可复用的技术样本。 二、程序整体架构设计 2.1 功能模块划分directory_lister.c程序基于模块化设计理念,划分为四个核心功能模块,各模块通过清晰的接口定义实现协同工作,共同完成目录列表功能: 参数解析模块:该模块负责解析命令行输入参数,实现目标目录路径的动态确定。程序通过argc(命令行参数数量)和argv(参数数组)获取用户输入,若未指定目录路径,则自动将当前工作目录作为默认目标。这种设计符合 Linux...
Linux:测试不同缓冲区大小对文件复制性能的影响
一. 文件复制性能测试程序技术解析在计算机系统性能优化领域,I/O 操作效率一直是关键研究方向。本文将深入解析一个用于测试不同缓冲区大小对文件复制性能影响的 C 语言程序,从底层系统调用到高层性能分析,全面阐述其技术实现与优化细节。 二. 程序整体架构设计该程序通过动态调整缓冲区大小(1KB 至 1MB),对文件复制过程进行性能测试。整体架构遵循 "打开 - 读取 - 写入 - 关闭" 的经典 I/O 操作流程,并引入精确计时机制与健壮的错误处理逻辑。程序的核心创新点在于:通过控制单一变量(缓冲区大小)来量化其对 I/O 性能的影响,为系统调优提供数据支撑。 三. 核心函数功能解析3.1 系统调用层函数3.1.1 open 函数12int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t...
Linux 0.11(五):从键盘输入到结果显示的底层机制
导言 Linux 操作系统凭借其开源特性与强大性能,在计算机领域占据重要地位。Linux 0.11 作为 Linux 发展早期的经典版本,其源代码蕴含着操作系统核心功能的基础设计思想。 详情见品读 Linux 0.11 核心代码。 一、输入阶段:命令的获取与缓冲 1.1 键盘输入处理机制当用户在键盘上按下一个按键时,硬件会触发 0x21 号中断,进而调用keyboard_interrupt中断处理函数。此时键盘控制器发送的扫描码会经历三重处理: 扫描码转换:通过键盘映射表转换为对应的 ASCII 码 队列存储:字符被存入tty_read_q原始输入队列 终端处理:copy_to_cooked函数对字符进行规范处理,如退格删除、换行转换等,处理后的字符存入secondary规范队列 这两个关键队列的分工如下: 1tty_read_q (原始队列) ← 扫描码 → ASCII转换 → secondary (规范队列) 1.2 命令读取与阻塞控制shell...
Linux 0.11(四):操作系统核心模块解析
导言 在操作系统的演进历程中,Linux 0.11 版本作为开源操作系统发展的重要里程碑,其系统架构设计与核心功能实现对现代操作系统具有深远的研究价值。 详情见品读 Linux 0.11 核心代码。 一、核心模块解析 1.1 物理内存管理的数据结构Linux 0.11 采用mem_map数组作为物理内存管理的核心数据结构,该数组定义于mm/memory.c文件中: 123456struct page { unsigned long flags; struct page *next; struct page *prev;};struct page mem_map[MEM_MAP_SIZE]; 每个数组元素对应一个物理页面(4KB),通过flags字段记录页面状态(空闲、已分配、锁定等),next和prev指针构成双向链表,用于空闲页面的组织与管理。这种设计实现了对物理内存的精细化管理,为内存分配与回收提供了数据基础。 1.2...
Linux 0.11(三):新进程诞生全流程解析
导言 在操作系统的底层架构体系中,新进程的创建过程是一个高度精密且系统化的工程,其每一个环节均凝聚着计算机科学领域的理论精华与工程实践智慧。以经典 UNIX 系统的实现机制为研究对象,深入剖析进程创建机制,不仅有助于理解其底层运行原理,更能揭示操作系统设计者在性能优化、安全防护与资源管理之间的精妙权衡策略。 详情见品读 Linux 0.11 核心代码。 一、核心代码与整体流程:系统启动的 "生命线" 1.1 main...
Linux 0.11(二):从底层搭建到系统觉醒的深度探索
导言 在计算机系统启动过程中,操作系统的初始化工作是一项高度复杂且精密的工程,其每个环节均对系统稳定运行起着决定性作用。对于经典的 Linux 0.11 版本而言,从内存管理机制的构建到各类设备驱动的初始化配置,这些底层操作共同构成了操作系统稳定运行的核心基础。各初始化阶段虽在功能上具有独立性,但在逻辑与数据交互层面紧密耦合,协同构建起完整的操作系统底层架构。 详情见品读 Linux 0.11 核心代码。 一、main 函数:初始化的核心枢纽 1.1 参数计算与初始化链构建操作系统启动过程中,main函数通过计算ROOT_DEV、drive_info、memory_end等核心参数,完成系统资源配置的基础工作。这些参数的准确获取与计算,为后续系统组件初始化提供必要的前提条件。基于上述参数,系统依次调用mem_init、trap_init等九个关键初始化函数,构建起完整的初始化调用链。该调用链以层次化的方式完成系统资源的初始化工作,确保各子系统间的依赖关系得到妥善处理,为操作系统的稳定运行奠定基础。 1.2...
Linux 0.11(一):进入内核前的底层机制剖析
导言 在操作系统的演进历程中,Linux 0.11作为经典版本,其启动过程蕴含着深刻的底层设计哲学。从计算机通电到内核正式接管系统,这一阶段涉及硬件初始化、实模式与保护模式切换、内存重定位等核心环节,每一步都堪称现代操作系统启动流程的缩影。 详情见品读 Linux 0.11 核心代码。 一、BIOS 加载阶段:启动流程的初始阶段 1.1 启动区加载:系统引导的关键区域计算机启动时,BIOS 首先读取硬盘主引导记录(MBR),即硬盘 0 盘 0 道 1 扇区。该扇区大小为 512 字节,包含启动代码及分区表信息。启动代码被加载至内存 0x7c00 地址,扇区末尾的 0x55AA 签名作为有效性验证标识。此验证机制确保 BIOS 仅执行合法的启动代码,从而保障系统启动的安全性与可靠性。 1.2 启动代码执行:系统初始化的开端位于 0x7c00 的 bootsect.s 代码作为启动流程的初始执行模块,承担系统启动初期的环境准备工作。该模块主要负责基本硬件检测、内存环境初始化等基础功能,为后续系统启动奠定基础。 二、内存数据搬运:系统资源的迁移过程 2.1...
Linux新手入门:GNU工具链实战笔记(从“啥都不懂”到“能打能修”)
一、编译工具链:代码到可执行程序的“工业流水线”编译是将人类可读的C代码转换为计算机可执行的二进制指令的过程。GNU编译器套件(GCC)通过预处理→编译→汇编→链接四阶段流水线实现这一转换,每个阶段均有明确的功能边界与技术实现。 1.1 预处理阶段:代码的文本转换与宏展开预处理(Preprocessing)由cpp(C Preprocessor)完成,核心任务是文本级别的代码转换,为后续编译阶段提供“干净”的输入。 关键操作与技术细节 头文件包含(#include):通过递归展开头文件内容(如#include 会插入标准库头文件的完整内容),解决代码复用问题。现代编译器(如GCC)采用“头文件缓存”优化,避免重复解析。 宏替换(#define):文本替换(如#define MAX 100将所有MAX替换为100),支持带参数的宏(如#define SQUARE(x) ((x)*(x)))和条件编译(如#ifdef DEBUG)。 行控制(#line):修改编译器报告的行号与文件名(常用于生成代码的工具链)。 技术验证:通过gcc -E hello.c -o...
Linux 基础操作与核心概念详解
一、Linux 系统架构:用户空间与内核的交互桥梁Linux 系统采用分层架构,核心逻辑围绕“用户空间”与“内核空间”的协作展开。用户程序无法直接操作硬件,必须通过内核提供的接口——这一接口正是我们今天要深入理解的系统调用、库函数与Shell 命令。 1.1 层次结构概览Linux 系统的运行逻辑可简化为三层模型(从用户到内核): 层级 角色描述 典型代表/技术 应用层 用户直接使用的软件(如浏览器、文本编辑器) Vim、GCC、Python 库函数层 对系统调用的封装,提供更易用的编程接口 C 标准库(如 fopen)、GNU C 库 系统调用层 内核暴露给用户空间的“唯一入口”,直接控制硬件资源 open、read、write 内核层 管理硬件资源(CPU、内存、磁盘),实现进程调度、文件系统等核心功能 Linux 内核(进程管理、内存管理) 关键结论:所有用户程序的操作(如读写文件、启动进程),最终都必须通过系统调用请求内核完成。 1.2 系统调用:用户与内核的“翻译官”系统调用(System...
Linux:从极客玩具到全球技术基石的传奇之路
引言如果说现代计算机的世界是一片浩瀚的海洋,那么Linux无疑是其中最汹涌的浪潮之一。它不仅打破了Windows与Unix长期垄断操作系统的格局,更以“开源”为旗帜,重塑了全球软件开发的协作模式。今天,我们将沿着时间线,从Unix的诞生说起,一步步揭开Linux如何从一个芬兰学生的“个人实验”,成长为支撑云计算、AI、移动设备的核心技术。 一、土壤:Unix与自由软件运动的萌芽(1960s-1990年代初)1.1 Unix的诞生:从“太空旅行”游戏开始的革命故事要从1969年的贝尔实验室说起。那时的计算机还是“庞然大物”,程序员需要通过打孔卡输入指令,等待数小时才能得到结果。为了改变这种低效,贝尔实验室、MIT和通用电气联合启动了Multics计划(多路信息计算系统),目标是让大型主机同时支持300多个终端——这在当时堪称“科幻级”设想。 但Multics项目因资金和技术复杂度过高,1969年贝尔实验室选择退出。不过,参与项目的工程师肯·汤普森(Ken...
我的 Linux 学习计划书
一、为什么是 Linux?参考 鸟叔讲 Linux、品读 Linux 0.11 核心代码 等资源。 二、我的学习目标:「能用」-->「掌控」避免成为「命令背诵者」,目标分阶段实现: 短期(1-3 个月):独立完成 Linux 服务器日常操作,编写可复用 Shell 脚本。 中期(3-6 个月):掌握系统调优、服务部署,解决 80% 常见故障。 长期(6 个月 +):形成「Linux 思维」,从底层逻辑定位问题根源。 三、分阶段执行计划:拆解「大目标」为「每日动作」阶段一:打基础(第 1-4 周)—— 建立操作直觉核心任务是理解操作底层逻辑,主攻文件系统、权限管理等模块。每日投入 1.5 小时,学习时避免贪多,如学 grep 先掌握 -i、-n、-r 基础参数。 阶段二:练实战(第 5-8 周)—— 从「操作」到「解决问题」每日投入 2 小时,跟随鸟叔课程实践,用博客记录 Shell 自动化、日志分析等模块心得。按课程流程完成项目,整理 Markdown 笔记,记录问题与解法。 阶段三:深扎根(6 个月后)—— 形成「技术自洽」通过读工具源码(如 grep 的...