上一课你会写基本脚本了。但 shell 的真正威力,在于把一堆小工具串成流水线——用一行命令,从几万行日志里筛出想要的东西。这一课,我们讲 管道、重定向,以及那三个让文本处理如虎添翼的工具——grep / sed / awk(合称"文本三剑客")。这是 shell 最硬核、也最实用的部分。从"三条水管"说起每个程序,天生带着三条"水管",用来跟外界交换数据:stdin(标准输入):数据从哪进来 …

上一课我们知道 shell 是"命令解释器"。但它远不止"一条条敲命令"——它还能把一堆命令写进一个文件,按顺序、带逻辑地自动执行,这就是 shell 脚本。这一课,我们学习脚本的四大件:变量、判断、循环、函数,并写出第一个真正能用的自动化脚本。从"把命令攒成一个文件"说起你有没有过这种经历:一连串命令,每次都要手动敲一遍,烦死了。shell 脚本就是解法:把这一串命令写进一个文件,以后每次运 …

从这一课起进入第七阶段:Shell 与脚本编程。前面几十课,你一直在"用命令"——ls、cd、grep、gcc——但你有没有想过:你敲下 ls 回车,到底是谁在背后把它翻译成动作、再交给内核执行的? 那个幕后的"翻译官",就叫 shell。这一课,我们回到终端这个最熟悉的地方,揭开 shell 的面纱。从"敲命令"这个动作说起你在终端敲下 ls,回车,屏幕上出现一堆文件名。这中间发生了什么?不 …

上一课我们用 select + 一个线程就扛住了多个客户端。但一个更深的问题浮出水面:一个连接,到底是"开个进程"伺候,还是"开个线程",还是"什么都不开、用事件驱动"? 这三种做法各有优劣,没有银弹。这一课,我们站在更高处,看清高并发服务器的三种模型,以及那个经典的设计模式——Reactor(反应器)。这是第六阶段(网络编程)的收官课。从"开餐馆"说起你开了家餐馆,客人络绎不绝。怎么安排服务 …

上一课我们写了个 TCP echo 服务器,但它有个致命毛病:一次只能服务一个客户端。第一个客户端连进来不说话,服务器就永远卡在 read 上,第二个人怎么等都进不来。这一课,我们解决这个问题——让一个进程同时伺候成千上万个客户端。核心武器,就是网络 I/O 模型:阻塞、非阻塞、多路复用、异步。从"一个接线员"说起想象你是客服接线员,负责接电话。有两种工作方式:死等式:接起一个电话,就只守着这 …

从这一课起,我们进入第六阶段:网络编程。前面全是"单机"视角——进程、内存、磁盘,都是自己跟自己玩。但从现在起,视野要扩展到网络:一个程序,怎么跟另一台机器上的另一个程序对话?"连接"到底意味着什么?这一课,我们从最基础的 socket 讲起,亲手写一个能跑通的 TCP echo 服务器。从"打电话"说起你想跟远方的朋友说话,需要什么?一部电话机。你拿起电话、拨号、等对方接、然后开始说话——你 …

你可能注意到一个现象:同一个文件,第一次打开慢,第二次打开就飞快。为什么?因为系统"记性很好"——读过的数据,它偷偷缓存起来了。这一课,我们讲缓存与磁盘调度,看清"为什么系统越用越快",以及"快"背后的代价。这是第五阶段(存储与 I/O)的收官课。从"第二次读文件为什么快"说起你第一次用 vim 打开一个大文件,可能要等一会儿;关掉,马上再打开——几乎秒开。同样的文件、同样的磁盘,为什么第二次 …

上一课讲了文件怎么存进磁盘。但还有个问题悬着:磁盘、键盘、网卡这些"外设",到底是怎么跟 CPU 对话的? 是你敲一下键盘,CPU 立刻知道;还是 CPU 一直盯着键盘问"按了吗按了吗"?这一课,我们走进 I/O 与设备,看清 CPU 和外设之间的三种对话方式,以及"等 I/O"这件事为什么是高性能系统的关键。从"烧水"说起你想烧一壶水。有三种做法:盯着烧:一直站在水壶边,盯着看"开了没、开了 …

从这一课起进入第五阶段:存储与 I/O。前面讲的内存是"电"里存的东西,一断电就没了;而你的文件,是要持久地存在磁盘上、关了机还能找回来的。那磁盘上一堆裸字节,是怎么被组织成你看到的"文件、文件夹"的?"文件名"和"文件"是同一个东西吗?这一课,我们走进文件系统。从"文件名其实是个假象"说起你在文件管理器里看到的是一棵漂亮的目录树:/home/user/文档/笔记.md。但磁盘上根本不存在"树 …

前面几课反复出现的"段错误""只读不可执行"这些字眼,其实都在暗示一件事:操作系统在偷偷保护你。这一课,我们站到攻击者的视角,看一个程序是怎么被攻破的——以及操作系统用什么手段,把这道防线一层层垒起来。这也是第四阶段(内存管理)的收官课。从"一个程序崩溃,为什么系统不崩"说起你可能遇到过:某个程序崩溃了,弹出"段错误(Segmentation fault)",但系统还好好的,其他程序照跑。为什 …