C++ 程序员应该了解的 Linux 命令

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)
相关推荐
烟雨书信11 分钟前
Linux中MySQL的逻辑备份与恢复
linux·运维·mysql
洗澡水加冰17 分钟前
n8n搭建多阶段交互式工作流
后端·llm
陈随易18 分钟前
Univer v0.8.0 发布,开源免费版 Google Sheets
前端·后端·程序员
wkj00123 分钟前
QuaggaJS 配置参数详解
java·linux·服务器·javascript·quaggajs
六月的雨在掘金23 分钟前
通义灵码 2.5 | 一个更懂开发者的 AI 编程助手
后端
超闻逸事30 分钟前
【题解】[UTPC2024] C.Card Deck
c++·算法
暴力求解41 分钟前
C++类和对象(上)
开发语言·c++·算法
让我们一起加油好吗1 小时前
【基础算法】枚举(普通枚举、二进制枚举)
开发语言·c++·算法·二进制·枚举·位运算
大锦终1 小时前
【C++】特殊类设计
开发语言·c++
朱龙凯1 小时前
MySQL那些事
后端