CSP-S 初赛 Linux 知识整理
整理范围:2019–2024 CSP-S 提高级第一轮真题(洛谷题面)+《NOI 2026 基础知识题库》 +《全国青少年信息学奥林匹克系列竞赛大纲(2025 年修订版)》。 结论先行:初赛 Linux 题题量少(每年 0–2 题,单选每题 2 分),但高度固定, 基本就是下面这份文档里的命令和概念换着花样考,背熟即可稳拿分。
0. 考纲定位(2025 年修订版大纲)
大纲把知识点按入门级 / 提高级 / NOI 级划分,高级自动包含低级全部内容,
每个知识点后 【X】 为学习难度系数(1~10)。
与 Linux / 编程环境直接相关的条目只有两处:
入门级 §2.1.1 基础知识与编程环境(难度 1,CSP-J 范围,CSP-S 默认已掌握)
- Windows、Linux 等操作系统的基本概念及其常见操作
- 使用图形界面新建、复制、删除、移动文件或目录
- 使用 Windows 下的集成开发环境(例如 Dev-C++ 等)
- 使用 Linux 下的集成开发环境(例如 Code::Blocks 等)
- 常用编译命令
g++的基本使用
- 常用编译命令
- 另 §2.1.2:编辑、编译、解释、调试的概念;文件的基本概念、 文本文件与二进制文件类型;文件重定向、文件读写等操作
提高级 §2.2.1 基础知识与编程环境(难度 5,CSP-S 初赛范围——本文重点)
- Linux 系统终端中常用的文件与目录操作命令
- Linux 系统下常见文本编辑工具的使用
- 常用编译命令
g++与相关编译选项 - 在 Linux 系统终端中运行程序,使用
time命令查看程序用时 - 调试工具 GDB 的使用
也就是说:初赛 Linux 大题范围=第 3、5、6、7 章+第 4 章的 g++/time/gdb,
难度 5,属于"会用即可、不考原理深挖"。NOI 级不再新增环境类知识点。
1. 历年真题中的 Linux 题一览
| 年份 | 题目 | 选项 | 答案 | 解析 |
|---|---|---|---|---|
| 2019 | 编译器的功能是() | A. 将源程序重新组合 / B. 将一种语言(通常是高级语言)翻译成另一种语言(通常是低级语言)/ C. 将低级语言翻译成高级语言 / D. 将一种编程语言翻译成自然语言 | B | 编译器=高级语言 → 低级语言(汇编/机器语言)的翻译程序。注意不是"自然语言",也不是"低级→高级"(那是反编译/反汇编)。 |
| 2020 | (无 Linux 题) | — | — | 当年 15 道单选无操作系统题,但不代表不考。 |
| 2021 | 在 Linux 系统终端中,列出当前目录下所有文件和目录的命令为() | ls / cd / cp / all |
ls |
ls = list,列目录内容;cd = 切换目录;cp = 复制。all 不是命令。 |
| 2022-1 | 在 Linux 系统终端中,切换工作目录的命令为() | ls / cd / cp / all |
cd |
cd = change directory。与上题是"姊妹题",出题人就爱在 ls/cd/cp/mkdir/pwd 里轮换。 |
| 2022-2 | 同时用 time 命令和秒表为某程序计时,time 输出 real 0m30.721s user 0m24.579s sys 0m6.123s,最接近秒表计时的是() |
30s / 24s / 18s / 6s | 30s | real = 实际流逝时间(=秒表时间);user = 用户态 CPU 时间;sys = 内核态 CPU 时间。秒表看的是 real。 |
| 2023-1 | 在 Linux 系统终端中,哪个命令可用于创建一个新的目录 | newdir / mkdir / create / mkfold |
mkdir |
mkdir = make directory。干扰项都是"看起来像"但不存在的命令。 |
| 2023-2 | 哪个命令能把 main.cpp 编译并生成名为 main 的可执行文件 |
g++ -o main main.cpp / g++ -o main.cpp main / g++ main -o main.cpp / g++ main.cpp -o main.cpp |
A | g++ -o <输出名> <源文件>。-o 后面紧跟的是输出文件名,所以只有 A 把输出定为 main、输入定为 main.cpp。 |
| 2024 | 在 Linux 系统中,如果想显示当前工作目录的路径,应该使用哪个命令 | pwd / cd / ls / echo |
pwd |
pwd = print working directory。echo 只是原样输出参数(echo hello → hello),不查路径。 |
命题规律:初赛 Linux 题只考三类——① 5 个基础命令(ls/cd/pwd/mkdir/cp/mv/rm 二选一辨析);
② g++ 编译命令写法;③ time 的 real/user/sys。外加题库里的 vim/gdb/进程题。下面逐个讲透。
2. Linux 基础常识(题库高频)
- NOI / CSP 复赛使用的操作系统是 Linux(发行版为 NOI Linux,基于 Ubuntu)。初赛考 Linux 就是为复赛上机做准备。
- Linux 是开源(开放源代码)的操作系统,可自由使用和修改。Windows/macOS 则不是。
- 最高权限用户是
root(超级用户),可以做任何事;普通选手账户权限受限。 - 默认使用的 Shell 是
bash(Bourne Again Shell)。"终端"里敲的命令都是由 bash 解释执行的。 - 文件系统大小写敏感:
FILE和File是两个不同文件;目录FOLDER和Folder也是两个不同目录。 Windows 下它们会被视为同一个——这是初赛最爱考的对比点。 - Linux 下换行符是
\n(Windows 是\r\n,Mac 旧系统是\r)。按行读入数据时多出的\r会造成 bug,复赛注意。 - 同一目录下,文件不能与子目录同名(名字是目录项的唯一标识,同名会冲突)。
- 虚拟终端切换:
Ctrl + Alt + F1~F6在各终端之间切换;NOI Linux 下Alt + F2可快速呼出命令/返回图形环境。 记法:凡是"切换终端"带Ctrl+Alt+Fn,凡是"NOI Linux 切回图形"认Alt+F2。
文件系统结构与路径
- 根目录:整个文件系统的起点,表示为
/,所有文件和目录都从它往下长。 - 家目录(Home Directory):用户登录后所在的初始目录。普通用户一般在
/home/用户名/下,root超级用户的家目录是/root。cd ~或裸cd回到的就是这里。 - 当前目录用
.表示,上级目录用..表示(所以cd ..是回上一级)。 - 绝对路径:从根目录
/开始的完整路径,如/usr/bin/g++,无论身在何处都指向同一位置。 - 相对路径:从当前目录开始的路径,如
./test(当前目录下的 test)、../doc/1.txt(上级目录的 doc/1.txt)。./a.out中的./就是"当前目录"的意思。
文件权限入门(为 chmod 打底,详见 §3.7)
- Linux 中每个文件和目录都有三组权限,分别对应三种身份: 用户(User, u)=文件所有者;组(Group, g)=同组用户;其他(Other, o)=其余所有人。
- 每组权限固定由三个字符表示,顺序永远是读(r)、写(w)、执行(x),没有则写
-。 - 示例
-rwxr-xr--:首字符-表示普通文件(d则为目录);rwx=用户可读可写可执行;r-x=组可读可执行、不可写;r--=其他人只读。
3. 文件与目录命令(核心中的核心)
3.1 显示当前路径:pwd
- 全称 print working directory,显示当前工作目录的完整(绝对)路径。
- 例:
pwd→/home/student/noi。 - 对比:
cd是"走过去",pwd是"问我在哪",ls是"看看周围有啥"。
3.2 列出目录内容:ls
| 用法 | 含义 |
|---|---|
ls |
列出当前目录下的文件和子目录(不含隐藏文件) |
ls -a |
列出全部,包括以 . 开头的隐藏文件(题库原题) |
ls -l |
长格式:显示权限、大小、修改时间等(可查看文件大小,题库原题) |
ls /tmp |
列出指定目录 |
- 隐藏文件:名字以
.开头,如.bashrc,正常ls看不见,必须ls -a。
3.3 切换目录:cd
| 用法 | 含义(题库原题:返回上一级是 cd ..) |
|---|---|
cd dir |
进入子目录 dir |
cd .. |
返回上一级目录 |
cd . |
留在当前目录(一般只用于 ./a.out 这种写法) |
cd ~ |
回家目录(当前用户的 home) |
cd / |
去根目录 |
cd - |
回到上一次所在的目录 |
cd(无参数) |
等价于 cd ~ |
- 绝对路径以
/开头(如/home/student),相对路径不以/开头(如../tmp)。
3.4 建/删目录:mkdir / rmdir
mkdir test:创建名为test的新目录(2023 真题)。mkdir -p a/b/c:连父目录一起建(a不存在也能建出a/b/c)。rmdir test:删除空目录;非空删不掉,非空要用rm -r。
3.5 复制 / 改名移动 / 删除:cp / mv / rm
cp 源 目标:复制文件。复制目录加-r:cp -r dir1 dir2。mv <原文件名> <新文件名>:改名(题库原题);mv 文件 目录/:移动。mv和cp的区别:mv原位置不留东西(搬家),cp原位置保留(复印)。rm 文件:删除文件;rm -r test:递归删除test目录及其中全部内容(题库原题);rm -f:强制删除不确认。rm删了不进回收站,rm -r尤其危险,复赛敲之前看三遍路径。
3.6 查看 / 查找文件
cat 文件:连接文件并打印到屏幕(看全文),如cat hello.cpp。必考!head -n 文件/tail -n 文件:看开头/结尾 n 行(默认 10 行)。touch a.cpp:新建空文件(或更新时间戳)。find . -name "*.cpp":在当前目录(.)及其子目录中按名查找文件(必考写法)。grep [选项] 模式 [文件]:在文件中按行搜索指定的字符串/模式,命中则整行打印。 全称 Global Regular Expression Print(全局正则打印),名字即功能:全局搜+整行打出。- 基本用法:
grep "hello" file.txt=打印file.txt中所有含hello的行; 不写文件名则从标准输入读,正好接管道:ps aux | grep python=从进程列表里过滤出含 python 的行。 - 常用选项(初赛只认这几个):
-n显示行号(grep -n "hello" f.txt);-i忽略大小写;-v反选(打印不含模式的行);-r递归搜整个目录;-c只数命中行数(等价于... | wc -l)。 - 组合技(常考):
cat file.txt | grep "main" | wc -l=先显示、再过滤含 main 的行、最后数行数。 - 对比
find:find . -name "*.cpp"是按文件名找文件,grep "main" *.cpp是按文件内容找字符串, 二者经常放一起辨析:找文件用 find,找内容用 grep。 wc:字数统计。wc -l file数行数(最常考),wc -w数单词数,wc -c数字节数。|管道、>/>>重定向见 §7。echo、man见 §7。- 记忆命令全称助记:
ls=list、cd=change directory、cp=copy、mv=move、rm=remove、pwd=print working directory、cat=concatenate。
3.7 权限管理:chmod(重中之重!)
chmod=修改文件/目录的权限模式,是整份文档里考得最多的单个命令,必须掌握两种写法。
1. 数字表示法(绝对模式,最常考!)
权限用三位八进制数表示,分别对应用户(u)、组(g)、其他(o)。先背换算:
r(读)= 4,w(写)= 2,x(执行)= 1,-(无)= 0,同组数字相加:7 = 4+2+1→rwx;6 = 4+2→rw-;5 = 4+1→r-x;4 = 4→r--。
常见考题:
chmod 755 file:用户7→rwx,组5→r-x,其他5→r-x。给可执行程序的典型权限。chmod 644 file:u=rw-(6), g=r--(4), o=r--(4)。给普通文本文件的典型权限。
2. 符号表示法:chmod [谁][操作符][权限] 文件名
- 谁:
u(用户)、g(组)、o(其他)、a(所有人); 操作符:+(添加)、-(移除)、=(设置);权限:r/w/x。 - 示例:
chmod o+x file(给其他人加执行权限);chmod g-w file(移除组的写权限);chmod a=rw file(所有人设为读写)。 - 对照 §2 的
-rwxr-xr--:看懂ls -l首列才能做符号法——ls -l+chmod经常绑在一起考。
4. 编译与运行(2023 真题+题库 5 题)
4.1 基本编译命令
g++ -o main main.cpp # main.cpp → 可执行文件 main(真题答案写法)
g++ main.cpp -o main # 等价,-o 后面永远跟"输出名"
./main # 运行当前目录下的 main(注意前面的 ./)
- 当前目录不在 PATH 里,所以运行当前目录程序必须加
./: 当前目录下编译好的a.out,执行命令是./a.out(题库原题),直接敲a.out会报找不到命令。 -o= output,指定输出文件名;不写-o时默认输出a.out。 2023 年真题 4 个选项就是考"你认不认得出-o后面跟的是输出"。
4.2 常用编译选项(题库全覆盖)
| 选项 | 含义 | 例子 |
|---|---|---|
-o 文件名 |
指定输出文件名 | g++ -o main main.cpp |
-c |
只编译不链接,生成 .o 目标文件 |
g++ -c main.cpp → main.o |
-g |
生成调试信息,供 gdb 调试用 |
g++ -g -o main main.cpp |
-Wall |
打开全部警告信息(Wall = Warn all) | g++ -Wall -o main main.cpp |
-O2 |
二级优化(复赛评测机一般开 -O2) |
g++ -O2 -o main main.cpp |
-std=c++17 |
指定 C++ 标准 | g++ -std=c++17 -o main main.cpp |
-lm |
链接数学库(用了 math.h 的函数时加) |
g++ -o main main.cpp -lm |
- 口诀:o 定名、c 暂存(.o)、g 调试、Wall 警告、O2 优化、lm 数学。
- 复赛标准编译命令一般形如:
g++ -o foo foo.cpp -lm -O2 -std=c++17 -Wall, 初赛把每个开关拆开单考,含义背熟即可。 - 补充写法:
g++ hello.cpp(无-o)默认生成a.out(Linux 下无.exe后缀);g++ -O2 -std=c++11 hello.cpp即"开 O2 优化、按 C++11 标准编译"的连写,选项可叠加、顺序无关。
4.3 编译器概念(2019 真题)
- 编译器的功能:把一种语言(通常是高级语言)翻译成另一种语言(通常是低级语言,如汇编/机器语言)。
- 反向(低级→高级)叫反编译;翻译成自然语言(中文/英文)不是编译器干的事——排除法秒选 B。
5. 调试、进程与计时
5.1 gdb 调试器
- NOI Linux 下调试程序用
gdb(题库原题)。 - 最小流程:
g++ -g -o main main.cpp(必须先-g)→gdb ./main→ 常用子命令run(运行)、break 行号(断点)、next(单步)、print 变量(看值)、quit(退出)。
5.2 看进程 / 杀进程
| 命令 | 含义(均为题库原题) |
|---|---|
ps |
查看当前系统中的进程 |
ps aux / top |
看所有进程及 CPU/内存占用(题库"查看 CPU 占用"认 ps) |
kill <pid> |
按进程号终止进程,如 kill 1234 |
killall test |
按名字杀死所有名为 test 的后台进程 |
Ctrl + C |
中断终端中正在运行的前台程序(死循环救命键) |
Ctrl + C= 中断,Ctrl + Z= 挂起,Ctrl + D= 输入结束(EOF)。
5.3 time 计时(2022 真题详解)
real 0m30.721s ← 墙上时钟走过的时间 = 秒表时间
user 0m24.579s ← 程序在用户态消耗的 CPU 时间
sys 0m6.123s ← 程序在内核态消耗的 CPU 时间
- 秒表对标
real,所以 30.721s → 选 30s。 - 单核单线程:
user + sys ≈ CPU 总耗时 ≤ real(多出的几秒是等待 I/O)。 - 多核/多线程:
user可以大于real(多个核同时烧 CPU)。
6. vim 编辑器(题库 4 题,年年有)
vim 有两种大状态:命令模式(默认,敲命令)按 Esc 回到;插入模式(打字)按 i/a/o 进入。
| 输入(命令模式下) | 效果 |
|---|---|
:q! |
强制退出、不保存(题库原题) |
:wq / :x |
保存并退出(题库原题二选一认 :wq) |
:w |
只保存不退出 |
:12 |
跳到第 12 行(题库原题) |
/12 |
在文件中查找字符串 12(题库原题),n 下一个,N 上一个 |
i / a / o |
进入插入模式(光标处/后一格/下一行新起一行) |
Esc |
回命令模式 |
dd |
删除当前行;yy 复制当前行;p 粘贴 |
u |
撤销;gg 文件头;G 文件尾;:set nu 显示行号 |
- 记忆钩:q 退出、w 保存、! 强制、数字跳行、斜杠查找。考题就是
:q!/:wq/:12//12四换一。
7. Shell 常用符号(重定向 / 管道)
| 符号 | 含义 | 例子 | ||
|---|---|---|---|---|
> |
重定向输出(覆盖文件) | ./main > out.txt |
||
>> |
重定向输出(追加到文件末尾) | echo hi >> log.txt |
||
< |
重定向输入(从文件读) | ./main < in.txt |
||
| `\ | ` | 管道(前一个命令的输出当后一个的输入) | `ls \ | grep cpp` |
; |
顺序执行多条命令 | g++ -o main main.cpp; ./main |
||
&& |
前一条成功才执行后一条 | g++ -o main main.cpp && ./main |
||
* / ? |
通配符(任意多 / 单个字符) | rm *.o |
||
~ |
家目录 | cd ~ |
||
echo |
原样输出参数(2024 真题干扰项) | echo hello → hello |
||
man 命令 |
看手册 | man g++ |
- 复赛典型用法:
./main < data.in > data.out一行搞定输入输出重定向。
8. 易错速记表(一页背完)
- NOI 考试 OS=Linux;最高权限用户=root;默认 Shell=bash。
- 列目录
ls,看隐藏ls -a,看大小ls -l;在哪pwd;换目录cd,上级cd ..;建目录mkdir。 - 改名/移动
mv,复制cp(目录加 -r),删目录rm -r test;rm删了极难恢复。 - 编译
g++ -o main main.cpp(-o后跟输出,默认a.out);运行./a.out(必须./)。 -c生成.o,-g调试信息,-Wall警告,-lm数学库,-O2优化。- 调试
gdb(先-g编译);看进程ps;按名杀killall test;按号杀kill pid;死循环Ctrl+C。 - 计时认
real(秒表时间);user用户态、sys内核态。 - vim:
:q!不存退,:wq存退,:12跳行,/12查找。 - 大小写敏感:
FILE ≠ File;换行\n;终端切换Ctrl+Alt+Fn,NOI 回图形Alt+F2。 - 编译器=高级语言→低级语言;权限
chmod必考:755=可执行程序,644=普通文本,r=4/w=2/x=1。
9. 自测 10 题(含答案)
- 列出当前目录(含隐藏文件)用? →
ls -a - 返回上一级目录用? →
cd .. - 删除当前目录下
test目录用? →rm -r test - 把
a.cpp改名为b.cpp用? →mv a.cpp b.cpp - 显示当前路径用? →
pwd g++ -o main main.cpp中-o main的意思是? → 指定输出文件名为main- 只编译不链接生成
.o的选项是? →-c;带调试信息的选项是? →-g time输出 real/user/sys,哪个最接近秒表? →real- vim 不保存强制退出 / 跳到第 5 行 / 查找
abc分别是? →:q!/:5//abc killall test和kill 1234的区别是? → 前者按名字杀所有test进程,后者按进程号杀指定进程
10. 备考建议
- 重点攻克
chmod:熟练掌握数字表示法(755、644),怎么换算、典型值对应什么场景。 - 理解管道和重定向:明白
|、>、>>的作用和区别,能读懂cat file | grep main | wc -l这类组合。 - 动手实践:条件允许就在本机装 Linux 虚拟机(VirtualBox + Ubuntu)或用 WSL(Windows Subsystem for Linux), 把本文命令亲手敲一遍。光靠死记硬背容易混淆,上机一遍就记牢。
- 刷真题:把 §1 的历年题遮住答案重做一遍,再拿题库 vim/gdb/
ps/-o/-c/-g题自测。
