Linux 相关命令、gcc 工具链、Linux 特有 API、Makefile 以及 CMake,命令有基础命令和程序员专用命令,总共就是这几个部分:
- Linux 常用命令,例如 pwd/cd/grep/rm/mv 等,选最常用的 20 个左右
- 编译器相关的工具链,主要是 gcc,熟悉常用的选项,如 -O/-o/-S 等
- 熟悉调试和性能测评相关的常用命令,如 strace/tcpdump/iostat 等
- 熟悉 Linux 的 API,主要是 C++ 没有的,像 thread、filesystem 之类的 C++ 已经有了可以不学,但是 socket 相关,epoll/io_uring 需要学,还有就是共享内存、进程的 fork 之类的
- Makefile 以及 CMake 相关
1. Linux 常用基础命令
知识点 | 说明 | 示例 |
---|---|---|
pwd | 显示当前工作目录 | pwd |
cd | 切换目录 | cd /home/user |
ls | 列出目录内容 | ls -la(显示详细列表,包括隐藏文件) |
cp | 复制文件或目录 | cp src.txt dest.txt |
mv | 移动或重命名文件 | mv old.txt new.txt |
rm | 删除文件或目录 | rm -rf dir/(强制递归删除目录) |
cat | 查看文件内容 | cat file.txt |
grep | 文本搜索工具 | grep "error" log.txt |
find | 查找文件 | find / -name "*.cpp" |
chmod | 修改文件权限 | chmod 755 script.sh |
chown | 修改文件所有者 | chown user:group file.txt |
ps | 查看进程状态 | ps aux | grep nginx |
top/htop | 实时监控进程和系统资源 | top(按 CPU 排序) |
kill | 终止进程 | kill -9 1234(强制终止 PID 1234) |
tar | 打包/解压文件 | tar -czvf archive.tar.gz dir/ |
ssh | 远程登录服务器 | ssh [email protected] |
scp | 安全复制文件 | scp file.txt user@host:/path/ |
curl/wget | 下载文件或测试HTTP请求 | curl -O example.com/file.zip |
man | 查看命令手册 | man ls |
| | 管道用于将前一个命令的输出作为下一个命令的输入 | cat log.txt | grep "error" |
2. 编译器工具链(GCC 常用选项)
知识点 | 说明 | 示例 |
---|---|---|
-o | 指定输出文件名 | gcc -o hello hello.c |
-O1/-O2/-O3 | 优化级别(代码性能优化) | gcc -O2 main.c |
-g | 生成调试信息(用于GDB) | gcc -g program.c |
-Wall | 启用所有警告 | gcc -Wall main.c |
-I | 添加头文件搜索路径 | gcc -I/usr/local/include main.c |
-L | 添加库文件搜索路径 | gcc -L/usr/local/lib -lmylib main.c |
-l | 链接库文件 | gcc -lpthread main.c |
-D | 定义宏 | gcc -DDEBUG main.c |
-S | 生成汇编代码 | gcc -S main.c |
-E | 仅执行预处理 | gcc -E main.c > preprocessed.c |
-shared | 生成动态库(.so) | gcc -shared -o libfoo.so foo.c |
-static | 静态链接 | gcc -static main.c |
3. 调试与性能测评工具
知识点 | 说明 | 示例 |
---|---|---|
gdb | 调试工具(设置断点、查看变量) | gdb ./a.out → break main → run |
strace | 跟踪系统调用和信号 | strace -e open,read ./program |
valgrind | 内存泄漏检测和性能分析 | valgrind --leak-check=yes ./a.out |
perf | 性能分析工具(CPU、缓存等) | perf record ./a.out → perf report |
lsof | 列出打开的文件和网络连接 | lsof -i :8080(查看占用8080端口的进程) |
netstat | 查看网络状态 | netstat -tuln(显示监听中的端口) |
vmstat | 监控系统资源(CPU、内存、IO) | vmstat 1(每秒刷新一次) |
iostat | 监控磁盘I/O | iostat -x 2(每2秒显示详细磁盘统计) |
tcpdump | 抓取网络数据包 | tcpdump -i eth0 port 80 |
4. Linux 特有 API(C++ 标准库未覆盖的部分)
知识点 | 说明 | 示例 |
---|---|---|
fork() | 创建子进程 | pid_t pid = fork(); |
exec 系列 | 执行外部程序 | execl("/bin/ls", "ls", "-l", NULL); |
pipe() | 进程间通信(无名管道) | int fd[2]; pipe(fd); |
shmget() | 共享内存操作 | shmget(IPC_PRIVATE, size, 0666); |
epoll | 高效 I/O 多路复用(替代 select) | epoll_create1(0); → epoll_ctl() |
io_uring | 异步 I/O 框架(高性能场景) | 需包含 liburing 库并调用 io_uring_setup |
socket() | 网络通信(TCP/UDP) | int sockfd = socket(AF_INET, SOCK_STREAM, 0); |
fcntl() | 控制文件描述符属性(非阻塞 I/O 等) | fcntl(fd, F_SETFL, O_NONBLOCK); |
signal() | 信号处理(如 SIGINT、SIGSEGV) | signal(SIGINT, handler_func); |
inotify | 监控文件系统事件 | inotify_init() → inotify_add_watch() |
syslog() | 系统日志记录 | syslog(LOG_ERR, "Error: %s", msg); |
mmap() | 内存映射文件 | void* addr = mmap(..., fd, 0); |
5. 构建工具(Makefile/CMake)
Makefile 基础语法:
规则定义 | 目标: 依赖 → 命令 | app: main.cpp utils.cpp g++ -o app main.cpp utils.cpp |
---|---|---|
变量定义与引用 | 使用 VAR = value 和 $(VAR) | CC = g++ CFLAGS = -Wall -O2 |
自动变量 | $@(目标)、$^(所有依赖)、$<(第一个依赖) |
app: main.o utils.o $(CC) $^ -o $@ |
伪目标(Phony Target) | 声明不生成文件的命令(如 clean) | .PHONY: clean clean: rm -f *.o app |
条件判断 | 使用 ifeq/else/endif | ifeq ($(DEBUG),1) CFLAGS += -g endif |
函数调用 | 如 $(wildcard *.cpp) 获取文件列表 | SRC = $(wildcard src/*.cpp) |
CMake 基础语法:
项目声明 | project()和cmake_minimum_required() | cmake_minimum_required(VERSION 3.10) project(MyApp) |
---|---|---|
生成可执行文件 | add_executable() | add_executable(app main.cpp utils.cpp) |
生成库文件 | add_library() | add_library(mylib STATIC mylib.cpp) |
链接库 | target_link_libraries() | target_link_libraries(app mylib pthread) |
设置变量 | set() 和 option() | set(CMAKE_CXX_STANDARD 17) option(BUILD_TESTS "Build tests" ON) |
包含目录 | target_include_directories() | target_include_directories(app PUBLIC include/) |
条件语句 | if()/else()/endif() | if(UNIX) add_definitions(-DLINUX) endif() |
查找依赖包 | find_package() | find_package(OpenSSL REQUIRED) |
安装规则 | install() | install(TARGETS app DESTINATION bin) |