Logo wfirstzhang 的博客

博客

CSP-S Linux相关知识(详细)

avatar wfirstzhang 2026-09-05 11:01:14

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 默认已掌握)

    1. Windows、Linux 等操作系统的基本概念及其常见操作
    1. 使用图形界面新建、复制、删除、移动文件或目录
    1. 使用 Windows 下的集成开发环境(例如 Dev-C++ 等)
    1. 使用 Linux 下的集成开发环境(例如 Code::Blocks 等)
    1. 常用编译命令 g++ 的基本使用
  • 另 §2.1.2:编辑、编译、解释、调试的概念;文件的基本概念、 文本文件与二进制文件类型;文件重定向、文件读写等操作

提高级 §2.2.1 基础知识与编程环境(难度 5,CSP-S 初赛范围——本文重点)

  1. Linux 系统终端中常用的文件与目录操作命令
  2. Linux 系统下常见文本编辑工具的使用
  3. 常用编译命令 g++ 与相关编译选项
  4. 在 Linux 系统终端中运行程序,使用 time 命令查看程序用时
  5. 调试工具 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. 易错速记表(一页背完)

  1. NOI 考试 OS=Linux;最高权限用户=root;默认 Shell=bash。
  2. 列目录 ls,看隐藏 ls -a,看大小 ls -l;在哪 pwd;换目录 cd,上级 cd ..;建目录 mkdir。
  3. 改名/移动 mv,复制 cp(目录加 -r),删目录 rm -r test;rm 删了极难恢复。
  4. 编译 g++ -o main main.cpp(-o 后跟输出,默认 a.out);运行 ./a.out(必须 ./)。
  5. -c 生成 .o,-g 调试信息,-Wall 警告,-lm 数学库,-O2 优化。
  6. 调试 gdb(先 -g 编译);看进程 ps;按名杀 killall test;按号杀 kill pid;死循环 Ctrl+C。
  7. 计时认 real(秒表时间);user 用户态、sys 内核态。
  8. vim::q! 不存退,:wq 存退,:12 跳行,/12 查找。
  9. 大小写敏感:FILE ≠ File;换行 \n;终端切换 Ctrl+Alt+Fn,NOI 回图形 Alt+F2。
  10. 编译器=高级语言→低级语言;权限 chmod 必考:755=可执行程序,644=普通文本,r=4/w=2/x=1。

9. 自测 10 题(含答案)

  1. 列出当前目录(含隐藏文件)用? → ls -a
  2. 返回上一级目录用? → cd ..
  3. 删除当前目录下 test 目录用? → rm -r test
  4. 把 a.cpp 改名为 b.cpp 用? → mv a.cpp b.cpp
  5. 显示当前路径用? → pwd
  6. g++ -o main main.cpp 中 -o main 的意思是? → 指定输出文件名为 main
  7. 只编译不链接生成 .o 的选项是? → -c;带调试信息的选项是? → -g
  8. time 输出 real/user/sys,哪个最接近秒表? → real
  9. vim 不保存强制退出 / 跳到第 5 行 / 查找 abc 分别是? → :q! / :5 / /abc
  10. killall test 和 kill 1234 的区别是? → 前者按名字杀所有 test 进程,后者按进程号杀指定进程

10. 备考建议

  1. 重点攻克 chmod:熟练掌握数字表示法(755、644),怎么换算、典型值对应什么场景。
  2. 理解管道和重定向:明白 |、>、>> 的作用和区别,能读懂 cat file | grep main | wc -l 这类组合。
  3. 动手实践:条件允许就在本机装 Linux 虚拟机(VirtualBox + Ubuntu)或用 WSL(Windows Subsystem for Linux), 把本文命令亲手敲一遍。光靠死记硬背容易混淆,上机一遍就记牢。
  4. 刷真题:把 §1 的历年题遮住答案重做一遍,再拿题库 vim/gdb/ps/-o/-c/-g 题自测。

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。

wfirstzhang Avatar
密码是111111
活跃度 近 53 周
查看全年