SE_Wang 的文章
  • 【Linux进阶系列】:信号

    要理解信号,首先需要了解信号产生的原因及其意义。信号涉及两个主要对象:发送方与接收方。在操作系统中,信号的发送方是操作系统本身,而接收方则是进程。 信号的第一个作用是管理接收信号的对象,具体方式是通过使进程执行信号对应的默认动作。这可以类比现实中的交通信号灯:司机作为信号的接收方,在看到红灯(信号)时,必须立即停车。交通信号灯正是通过这种方式来管理交通参与者。 在 Linux 系统中,信号的接收对象是进程。进程的每个行为都对应底层的代码执行。当进程执行了非法操作,例如非法访问内存,操作系统便会向该进程发送一个信号。进程在接收到信号后,需执行该信号对应的默认行为。例如,若操作系统向进程发送 9 号信号(SIGKILL),其默认动作是终止进程。进程一旦收到该信号,就会被立即终止,从而无法继续执行非法行为。通过这种方式,操作系统能够有效管理进程,维护系统稳定。这是信号的一种典型应用场景。 除了管理进程行为、防止非法操作之外,信号的第二个应用场景是进程间通信。在多进程协同完成任务时,进程之间需要了解彼此的执行状态,因此存在通信需求。我们之前已经学过进程间通信(IPC)的其他方式,如匿名管道、命名管道和共享内存等。与这些传统通信方式相比,信号属于一种轻量级的通信机制。它只能简单通知某个事件已发生(例如“我完成了”),而无法像共享内存或管道那样传递大量数据或具体内容。因此,信号通常适用于异步通知的场景。所谓异步通知,是指进程在未收到信号时可以持续执行自身任务,直到信号到达时才中断当前处理流程去响应信号。在等待期间,进程不会被阻塞,也无需主动查询信号状态。不过,由于传统 IPC 机制在功能上更为强大和灵活,信号在进程通信中的应用相对较少。 了解了信号的意义与使用场景后,接下来我们将从信号的产生、信号的保存,以及信号的……

    SE_Wang 2025-10-31
    24 0 0
  • 【Linux】Ubuntu 与 CentOS 选择指南:两大主流 Linux 发行版的优劣势对比

    摘要 在广袤的 Linux 世界中,Ubuntu 和 CentOS 无疑是两颗最耀眼的明星,尤其是在服务器领域,它们占据了绝大部分市场份额。然而,对于初学者、开发者乃至经验丰富的运维工程师来说,“到底该用 Ubuntu 还是 CentOS?” 这个问题几乎成了一个永恒的议题。这两种发行版源于不同的技术“血统”,拥有迥异的设计哲学、软件包管理方式和社区生态,导致它们在稳定性、软件更新速度、商业支持和用户体验上表现出显著差异。本文旨在提供一份终极选择指南,我们将从它们的起源说起,深入剖析两者在软件包管理(APT vs. DNF)、发布周期、软件生态、安全模型(AppArmor vs. SELinux)等核心维度的优劣势。通过丰富的代码示例和场景化分析,无论您是搭建个人博客、部署企业级应用,还是投身云计算和容器化浪潮,本文都将为您提供清晰的决策依据,助您在 Ubuntu 与 CentOS 之间做出最适合自己的选择。 一、引言:为何要在 Ubuntu 和 CentOS 之间选择? 当您准备启动一台新的云服务器、配置开发环境或为公司的生产环境选择操作系统时,Linux 发行版的选择是您面临的第一个,也是至关重要的决策。在成百上千个发行版中,Ubuntu 和 CentOS 凭借其强大的稳定性、广泛的社区支持和丰富的软件生态系统,常年稳居服务器操作系统的头两把交椅。 Ubuntu:由 Canonical 公司赞助,以其用户友好的桌面体验和庞大、活跃的社区而闻名。它在开发者、初创公司和云计算领域广受欢迎,以提供最新软件包和功能而著称。 CentOS:曾经是 Red Hat Enterprise Linux (RHEL) 的社区克隆版,以其极致的稳定性和企业级的可靠性而备受推崇,是传统数据中心和 Web 托管行业的标准。(重要提示:CentOS Linux 8 已于 2021 年底停止维护,其后继者是 CentOS Stream,一个滚动预览 RHEL 的版本。本文将主要基于这一新背景进行讨论。) 选择它们中的任何一个,……

    SE_Wang 2025-10-30
    167 0 0
  • Linux 新手避坑指南:7 个高频指令精讲 + 重定向从入门到精通

    一. 前置知识:Linux的底层逻辑 1.1 Linux指令本质: 终端输入的 ls,cp等指令,本质是系统中预先编译好的可执行程序(可执行文件)罢了,分两类: 内置指令:如 cd、alias,是 Shell 自带程序,无独立路径(which cd 查不到)。 外部指令:如 ls、cp,是/usr/bin 等目录下的独立文件(which ls 可定位),终端可直接调用。 补充说明: 指令,可执行程序,二进制文件,可执行文件其实是一回事。 1.2 ls vs ls-l vs ll: 命令 本质 显示内容 特点 ls 基础命令 仅文件名(多列) 简洁、快速 ls -l 带选项的命令 详细信息(权限、所有者、大小等) 功能强大,信息全面 ll ls -l的别名 与 ls -l 完全相同 快捷方式,输入更方便 ls:只显示文件名(最基础)。 ls -l:显示文件详细权限、大小、时间等信息。 ll:是 ls -l 的快捷方式(一个命令别名),两者输出完全一样。 1.3 “一切皆文件”:从 /dev 设备说起 Linux 中所有对象抽象为文件,包括硬件设备(存于 /dev 目录)。 核心案例:终端窗口对应 /dev/pts/N 设备文件(N 为编号),向其写入内容会直接在终端显示: # 步骤1:查看终端设备文件 [root@VM-4-4-centos ~]# ls -l /dev/pts # 带权限详情 total 0 crw--w---- 1 root tty 136, 0 Oct 12 11:40 0 # 终端0(字符设备,c开头) crw--w---- 1 root tty 136, 1 Oct 12 11:40 1 # 终端1 c-------- 1 root root 5, 2 Mar 12 2025 ptmx # 步骤2:向终端1写入内容(在终端1可见) [root@VM-4-4-centos ~]# echo "Hello from terminal 0" > /dev/pts/1 [root@VM-4-4-centos ~]# echo "Repeat 3 times" > /dev/pts/1 1.4 重定向:控制文件数据流 基于 “一切皆文件”,重定向改变数据流向: >:覆盖写入文件(如 echo “a” > file) >>:追加写入文件(如 echo “b” >> file) <:从文件读取输……

    SE_Wang 2025-10-29
    105 0 0
  • 【Linux】深入浅出 Linux 自动化构建:make 与 Makefile 的实用指南

    🎨一、背景:为什么需要 make/Makefile? 想象一下,你有一个由多个.c文件组成的项目,每次修改代码后都要手动执行gcc -c file1.c、gcc -c file2.c、gcc -o target file1.o file2.o…… 这样的重复劳动不仅低效,还容易出错。 make是一个命令工具,Makefile是一个规则文件,二者配合实现了自动化编译:只需编写一次规则,后续执行make命令即可自动完成 “哪些文件需要编译、哪些需要重编译” 的判断,极大提升开发效率。 对于大型工程,会不会写 Makefile 甚至成为衡量工程师能力的一个侧面标准 —— 毕竟它能清晰管理 “文件依赖、编译顺序、清理逻辑” 等复杂场景。 🧪二、核心概念:依赖关系与依赖方法 makefile 的核心是 “依赖关系”和“依赖方法”: 依赖关系:描述 “目标文件” 依赖于哪些 “源文件”。例如,可执行文件hello依赖于目标文件hello.o,hello.o依赖于汇编文件hello.s,以此类推。 依赖方法:描述如何从 “依赖文件” 生成 “目标文件”(通常是编译命令)。 【案例】:一个简单的 C 项目 我们以输出 “hello Makefile!” 的小程序为例,逐步构建 Makefile。 【步骤 1】:编写 C 代码(hello.c) #include <stdio.h> int main() { printf("hello Makefile!\n"); return 0; } 【步骤 2】:编写 Makefile 规则 一个完整的 Makefile 规则格式为: 目标文件: 依赖文件 依赖方法(编译命令,注意开头必须是Tab缩进) 针对hello.c,我们可以编写多层依赖的 Makefile: # 最终可执行文件hello,依赖于hello.o hello: hello.o gcc hello.o -o hello # 目标文件hello.o,依赖于hello.s hello.o: hello.s gcc -c hello.s -o hello.o # 汇编文件hello.s,依赖于hello.i hello.s: hello.i gcc -S hello.i -o hello.s # 预处理文件hello.i,依赖于hello.c hello.i: hello.c gcc -E hello.c -o hello.i 【步骤 3】:执行 m……

    SE_Wang 2025-10-28
    66 0 0
  • Linux 新手避坑指南:7 个高频指令精讲 + 重定向从入门到精通(含完整选项 + 设备文件实操)

    本文基于 “一切皆文件” 核心思想,结合 /dev 设备文件实操案例,详细拆解 which、alias、man、echo、cp、mv 6 个指令及重定向用法,附带完整选项说明和场景化案例,帮你从 “会用” 到 “精通”。   一. 前置知识:Linux的底层逻辑 1.1 Linux指令本质: 终端输入的 ls,cp等指令,本质是系统中预先编译好的可执行程序(可执行文件)罢了,分两类: 内置指令:如 cd、alias,是 Shell 自带程序,无独立路径(which cd 查不到)。 外部指令:如 ls、cp,是/usr/bin 等目录下的独立文件(which ls 可定位),终端可直接调用。 补充说明: 指令,可执行程序,二进制文件,可执行文件其实是一回事。 1.2 ls vs ls-l vs ll: 命令 本质 显示内容 特点 ls 基础命令 仅文件名(多列) 简洁、快速 ls -l 带选项的命令 详细信息(权限、所有者、大小等) 功能强大,信息全面 ll ls -l的别名 与 ls -l 完全相同 快捷方式,输入更方便 ls:只显示文件名(最基础)。 ls -l:显示文件详细权限、大小、时间等信息。 ll:是 ls -l 的快捷方式(一个命令别名),两者输出完全一样。 1.3 “一切皆文件”:从 /dev 设备说起 Linux 中所有对象抽象为文件,包括硬件设备(存于 /dev 目录)。 核心案例:终端窗口对应 /dev/pts/N 设备文件(N 为编号),向其写入内容会直接在终端显示: # 步骤1:查看终端设备文件 [root@VM-4-4-centos ~]# ls -l /dev/pts # 带权限详情 total 0 crw--w---- 1 root tty 136, 0 Oct 12 11:40 0 # 终端0(字符设备,c开头) crw--w---- 1 root tty 136, 1 Oct 12 11:40 1 # 终端1 c-------- 1 root root 5, 2 Mar 12 2025 ptmx # 步骤2:向终端1写入内容(在终端1可见) [root@VM-4-4-centos ~]# echo "Hello from terminal 0" > /dev/pts/1 [root@VM-4-4-centos ~]# echo "Repeat 3 times" > /dev/p……

    SE_Wang 2025-10-27
    337 0 0
  • 【Linux】Linux 权限管理入门指南

    📌一、shell命令以及运行原理 1.1 shell是啥 严格来说,Linux 的核心是内核(kernel),但普通用户无法直接与内核交互。这时候,Shell 就登场了。Shell 是内核的 “外壳” 程序,作为命令行解释器(command Interpreter),它主要承担两大任务: 将用户输入的命令翻译给内核处理; 把内核的处理结果再翻译回给用户。 类比 Windows 系统,我们操作 Windows 并非直接与内核交互,而是通过图形界面(如双击 D 盘盘符进入磁盘)。在 Linux 中,Shell 有着相同的作用,它解析我们的指令并传递给内核,再将内核运行的结果解析后反馈给用户。 为了更形象理解,我们可以把 Shell 比作 “媒婆”。假设你(用户张三)对操作系统内核(村头的小花)有操作需求,却不方便直接 “表白”(交互),就可以通过 Shell(媒婆王婆,比如我们常用的 bash)来传达你的意思,由 Shell 把你的指令转给内核,再把内核的回应带回来。 shell 与 bash/sh的关系: 1. 概念范畴:shell 是对“命令行解释器”的统称,不特指某一款工具,相当于“水果”这类大类概念。 2. 具体实现:sh(Bourne Shell)和 bash(Bourne-Again Shell)都是 shell 的具体类型,属于“大类下的具体成员”。 3. 核心关联:sh 是最早的经典 shell 标准,奠定了基础功能;bash 是 sh 的增强版,完全兼容 sh 的语法,同时新增了更多实用功能(如命令补全、历史记录管理等),是目前最主流的 shell。 4. 日常称呼:无论实际使用的是 bash、sh 还是其他 shell(如 zsh),日常交流中都可以统称为“shell”,比如“用 shell 执行命令”。 1.2 Shell 命令的本质 指令的本质,是编译好的程序或脚本,它们会存放在系统的特定路径下。输入指令的过程,本质就是输入字符串。比如在 bash 命令行中,我们输入 ls 这样的命令,其实就是输入了一串字符,而这串字符对应着系统中特定的程序或脚本。 1……

    SE_Wang 2025-10-24
    25 0 0
  • Linux《进程概念》

    1. 环境变量 1.1 环境变量的概念 • 环境变量(environment variables)⼀般是指在操作系统中用来指定操作系统运行环境的⼀些参数 • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪 里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。 • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。 1.2 命令行参数表 以上给了环境变量的概念,但是这些概念现在对我们来说没啥用,因为目前对环境变量完全就没有一定认识,之后通过了解过环境变量具体的实例时候再去理解概念才会又收获。但在此在了解环境变量之前先要来了解命令行参数。 在之前我们在C/C++内编写代码的时候main函数都是没有参数的,那么是否main函数就不能带参呢? 其实和普通的函数一样,main函数也是可以带上参数的,在此第一个参数为就为在执行对应的可执行程序时输入的参数的个数,第二个参数就是一个字符串指针。 例如以下实现的代码: #include<stdio.h> #include<sys/types.h> #include<unistd.h> int main(int argc,char* argv[]) { for(int i=0;i<argc;i++) { printf("argv[%d]:%s\n",i,argv[i]); } return 0; } 将以上的代码编译成才执行查询之后运行,当我们在运行的时候带上参数就会输出以下的内容   通过以上的示例就可以看出main是可接收用户输入的参数的,之前我们没有使用过只不过是之前实现的程序只需要从头跑到尾即可,不需要处理用户进行选择的情况。 那么用户输入的参数又是怎么样传输给main函数的呢,main函数内又是怎么保存的呢? 其实在我们运行对应的程序时,程序内部都会有一张命令行参数表,在该表当中就存储着命令行内输入的参数。 例如以上的示例,命令行参数表就如下所示: 1.3 环境变量表 以上我们就了……

    SE_Wang 2025-10-23
    20 0 0
  • MySQL 事务与锁优化:解决 “并发死锁”“更新丢失” 的实战方案

    今天,我们在谈一下锁的问题,这个问题也是比较复杂,所以想着在谈一次,透彻一点,也是前阵子帮某电商平台紧急排查一个问题:大促期间 “商品超卖” 了 —— 明明库存只有 100 件,却卖出了 105 件,用户投诉不断。查了半天才发现,开发写的扣库存 SQL 没加锁,两个订单同时读库存、同时扣减,导致 “更新丢失”。后来加了一行SELECT ... FOR UPDATE,问题立刻解决。 事务和锁是 MySQL 并发控制的 “左右手”,但很多开发者只知道 “BEGIN...COMMIT” 和 “加索引”,遇到 “死锁”“超卖” 就慌了。这篇是 MySQL 专栏的并发优化实战篇,核心目标是帮你从 “知道事务 ACID” 进阶到 “能在高并发场景下用锁解决实际问题”。 本文用电商 / 金融的真实并发场景贯穿,每个知识点都配 “可复现的 SQL 步骤 + 执行结果 + 优化方案”,看完你不仅能搞懂 InnoDB 锁机制,还能直接把方案用到生产环境,避免 “超卖”“死锁” 这些线上事故。 一、先直面问题:高并发下,事务会遇到哪些坑? 在单线程场景下,事务很少出问题,但一旦多用户同时操作(比如电商大促、金融转账),3 个核心问题会立刻暴露:更新丢失、脏读、幻读。我们先从最常见的 “更新丢失” 切入,用实战案例讲透问题本质。 1. 最致命的坑:更新丢失(电商超卖、金融少记账) 场景:电商商品goods表,stock字段存库存,两个订单同时下单扣库存(库存初始 100)。问题:两个事务都读库存 = 100,都扣减到 99,最终库存变成 99(实际该扣 2 件,变成 98),导致超卖。 实战模拟:复现更新丢失 先准备测试表和数据: sql -- 商品表:id=1的商品,库存100 CREATE TABLE goods ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, stock INT NOT NULL DEFAULT 0 -- 库存 ); INSERT INTO goods VALUES (1, 'iPhone 15', 100); 一键获取完整项目代码 用两个会话(Session A、Session B)模拟……

    SE_Wang 2025-10-22
    75 0 0
  • 《Linux进阶指令实操指南》:文件查看、时间管理、搜索压缩全覆盖

    一. 文件内容操作:查看与编辑 1.1 cat & tac:正序 / 倒序查看文件 功能:查看目标文件的内容,tac就是逆序查看 语法:cat [选项] [文件] 常用选项: -b 对非空输出行编号,空行不做编号 -n 对输出的所有行编号 -s 不输出多行空行 实际案例: cat指令:   cat -n指令:   cat -b指令: # 测试 -b 对非空输出行编号 root@VM-24-15-ubuntu:~# cat -b temp.txt 1 hello CX330 2 hello CX330 3 hello CX330 4 hello CX330 5 hello CX330 6 hello CX330 7 hello CX330 8 hello CX330 9 hello CX330 10 hello CX330 11 hello CX330 12 hello CX330 13 hello CX330 14 hello CX330 15 hello CX330 16 hello CX330 17 hello CX330 18 hello CX330 19 hello CX330 20 hello CX330 21 hello CX330 一键获取完整项目代码 bash cat -s指令: root@VM-24-15-ubuntu:~# cat -b temp.txt hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 hello Cx330 一键获取完整项目代码 bash 注意:查看小文件,小算法,小配置文件,很短的代码都可以用cat。但是查看大文件时,cat就不好用了,在后面会给大家其它的指令来查看大文件 1.2 nano:轻量级文本编辑器 功能:支持基本的文本编辑功能(如复制、粘贴、查找替换、行号显示等),足够应对日常文本处理。 语法:nano 文件名 root@VM-24-15-ubuntu:~# nano temp.txt 一键获取完整项目代码 bash 常用快捷键(核心操作): 保存文件:Ctrl + O 退出编辑器(重点):Ctrl + X 查找文本:Ctrl + W 复制当前行:Ctrl + K 粘贴内容:Ctrl + U 撤销操作:Ctrl + _ 显示行……

    SE_Wang 2025-10-21
    72 0 0
  • 【Linux指令 (四)】基础指令收尾:打包、网络、历史与Shell运行原理深度解析——涵盖tar/scp/history/shutdown等Linux核心运维指令

    1 ~> 本期指令 tar,file,scp,bc,uname -e,histroy,su/su root,exit,sudo 2 ~> 本期热键 ctrl+c,ctrl+r,ctrl+d,tab 33 tar 33.1 概念 打包 / 解包,不打开它,直接看内容。 C语言写的二进制可执行程序。 33.2 语法 33.3 常用选项 -c:建立一个压缩文件的参数指令(create的意思); -X:解开一个压缩文件的参数指令! -t:查看tarfile里面的文件! -z:是否同时具有gzip的属性?亦即是否需要用gzip压缩? -j:是否同时具有bzip2的属性?亦即是否需要用bzip2压缩? -v:压缩的程中显示文件!这个常用,但不建议用在背景执行过程! -f:使用档名,请留意,在f之后要立即接档名喔!不要再加参数! -C:解压到指定目录 33.4 实践 33.4.1 将整个/etc目录下的文件全部打包成为/tmp/etc.tar [root@linux ~]$ tar -cvf /tmp/etc.tar /etc<==仅打包,不压缩! [root@linux ~]$ tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩 [root@linux ~]$ tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩 一键获取完整项目代码 bash 特别注意,在参数f之后的文件档名是自己取的,我们习惯上都用,tar来作为辨识。 如果加z参数,则以.tar.gz或.tgz来代表gzip压缩过的 tar file。 如果加j参数,则以.tar.bz2来作为附档名啊。 上述指令在执行的时候,会显示一个警告讯息: 【'tar: Removing leading`/" from member names`】 一键获取完整项目代码 bash 这是关于绝对路径的特殊设定。 33.4.2 查阅上述/tmp/etc.tar.gz文件内有哪些文件? [root@linux ~]$ tar -ztvf /tmp/etc.tar.gz 一键获取完整项目代码 bash 因为我们使用gzip压缩,所以要查阅该tar file内的文件时,就得要加上z这个参数,这很重要! 33.4.3 将/tmp/etc.tar.gz文件解压缩在/usr/local/src底下 [root@linux ~]$ cd /usr/local/src [……

    SE_Wang 2025-10-20
    51 0 0