一、Linux 应用开发是什么
Linux 应用开发通常指在 Linux 系统上编写、编译、调试、运行和发布用户态程序。它和 Android、嵌入式、服务端开发都有交集,但核心基础基本一致:
- 熟悉 Linux 文件系统、权限、进程、线程、信号、网络等机制。
- 能使用 GCC、Make、CMake 等工具构建程序。
- 能使用 GDB、strace、lsof、top、journalctl 等工具定位问题。
- 能理解动态库、静态库、环境变量、系统调用和进程通信。
- 能把程序打包、部署,并在目标环境中稳定运行。
Linux 下既可以开发命令行工具,也可以开发后台服务、网络程序、桌面应用、驱动配套工具、嵌入式应用等。入门阶段建议从命令行程序和后台服务开始,因为它们能覆盖最多基础能力。
二、开发环境准备
2.1 选择发行版
常见选择:
- Ubuntu / Debian:资料多,适合入门和服务器开发。
- Fedora:软件较新,适合跟进新工具链。
- CentOS Stream / Rocky Linux / AlmaLinux:偏企业服务器环境。
- Arch Linux:滚动更新,适合熟悉 Linux 后使用。
如果是新手,建议使用 Ubuntu LTS。
2.2 安装基础工具
Ubuntu / Debian:
1 | sudo apt update |
Fedora:
1 | sudo dnf groupinstall -y "Development Tools" |
检查版本:
1 | gcc --version |
2.3 推荐编辑器
常见选择:
- VS Code:配合 Remote SSH、C/C++ 插件、CMake Tools,入门友好。
- Vim / Neovim:适合终端开发。
- CLion:C/C++ 项目体验好,但需要授权。
- Qt Creator:适合 Qt 桌面应用。
入门阶段可以使用 VS Code,等熟悉终端工具后再逐步增加 Vim、tmux 等工具。
三、第一个 C 程序
创建文件:
1 | mkdir linux-demo |
写入代码:
1 |
|
编译:
1 | gcc hello.c -o hello |
运行:
1 | ./hello a b c |
输出类似:
1 | Hello Linux app development |
这里需要注意:
./hello表示运行当前目录下的可执行文件。- Linux 默认不会从当前目录搜索命令,所以不能直接输入
hello。 argc是参数个数。argv是参数数组。
四、编译基础
4.1 GCC 常用参数
1 | gcc main.c -o app |
含义:
main.c:源文件。-o app:输出可执行文件名。
常用参数:
1 | gcc main.c -o app -Wall -Wextra -g |
说明:
-Wall:开启常见警告。-Wextra:开启更多警告。-g:生成调试信息,方便 GDB 调试。
优化编译:
1 | gcc main.c -o app -O2 |
开发阶段建议使用:
1 | gcc main.c -o app -Wall -Wextra -g |
发布阶段再考虑:
1 | gcc main.c -o app -O2 |
4.2 编译多个文件
目录:
1 | linux-demo/ |
math_utils.h:
1 |
|
math_utils.c:
1 |
|
main.c:
1 |
|
编译:
1 | gcc main.c math_utils.c -o app -Wall -Wextra -g |
五、使用 Makefile
文件少的时候可以直接用 gcc,文件多了以后建议使用 Makefile。
创建 Makefile:
1 | CC := gcc |
注意:Makefile 的命令行前面必须是 Tab,不是空格。
编译:
1 | make |
清理:
1 | make clean |
重新编译:
1 | make clean |
六、使用 CMake
CMake 更适合跨平台和中大型项目。
目录:
1 | linux-demo/ |
CMakeLists.txt:
1 | cmake_minimum_required(VERSION 3.16) |
构建:
1 | cmake -S . -B build |
运行:
1 | ./build/app |
清理构建目录:
1 | rm -rf build |
实际项目中推荐使用 out-of-source build,也就是把构建产物放到 build 目录,避免污染源码目录。
七、调试程序
7.1 使用 GDB
编译时带上 -g:
1 | gcc main.c math_utils.c -o app -Wall -Wextra -g |
启动调试:
1 | gdb ./app |
常用命令:
1 | break main |
说明:
break main:在 main 函数打断点。run:开始运行。next:执行下一行,不进入函数。step:执行下一行,进入函数。print:打印变量。backtrace:查看调用栈。continue:继续运行。quit:退出。
7.2 调试崩溃
程序段错误:
1 | Segmentation fault (core dumped) |
可以开启 core dump:
1 | ulimit -c unlimited |
重新运行程序,生成 core 文件后调试:
1 | gdb ./app core |
在 GDB 中查看调用栈:
1 | backtrace |
7.3 使用 strace
strace 可以查看程序调用了哪些系统调用。
安装:
1 | sudo apt install -y strace |
使用:
1 | strace ./app |
查看文件访问:
1 | strace -e openat ./app |
保存日志:
1 | strace -o trace.log ./app |
如果程序提示文件不存在、权限不足、网络连接失败,strace 很有用。
八、Linux 文件和权限
8.1 常见目录
1 | /bin 基础命令 |
应用开发中常见路径:
- 配置文件:
/etc/your_app/ - 日志文件:
/var/log/your_app/ - 数据文件:
/var/lib/your_app/ - 可执行文件:
/usr/bin/your_app或/usr/local/bin/your_app
8.2 权限
查看权限:
1 | ls -l |
示例:
1 | -rwxr-xr-x 1 user user 12345 Jun 21 10:00 app |
含义:
r:读。w:写。x:执行。- 第一组:文件所有者权限。
- 第二组:所属组权限。
- 第三组:其他用户权限。
给程序增加执行权限:
1 | chmod +x app |
九、进程、线程和信号
9.1 查看进程
1 | ps aux | grep app |
查看某个进程打开的文件:
1 | lsof -p <pid> |
查看端口占用:
1 | ss -lntp |
9.2 信号
Linux 通过信号通知进程发生了某些事件。
常见信号:
SIGINT:终端 Ctrl+C。SIGTERM:请求进程正常退出。SIGKILL:强制杀死进程,不能被捕获。SIGHUP:终端断开或请求重新加载配置。
结束进程:
1 | kill <pid> |
强制结束:
1 | kill -9 <pid> |
开发后台服务时,应该优先处理 SIGTERM,收到后释放资源并正常退出。
十、日志和配置
10.1 日志
入门阶段可以先打印到标准输出:
1 |
|
后台服务建议输出结构化日志,至少包含:
- 时间。
- 日志级别。
- 模块名。
- 错误码。
- 关键参数。
示例:
1 | 2026-06-21 10:00:00 INFO server started port=8080 |
10.2 配置
常见配置方式:
- 命令行参数。
- 环境变量。
- 配置文件。
命令行参数适合一次性指定:
1 | ./app --port 8080 --config ./app.conf |
环境变量适合部署环境差异:
1 | APP_ENV=prod ./app |
配置文件适合长期配置:
1 | port=8080 |
十一、动态库和静态库
11.1 静态库
生成目标文件:
1 | gcc -c math_utils.c -o math_utils.o |
打包静态库:
1 | ar rcs libmathutils.a math_utils.o |
链接:
1 | gcc main.c -L. -lmathutils -o app |
11.2 动态库
编译动态库:
1 | gcc -fPIC -shared math_utils.c -o libmathutils.so |
链接:
1 | gcc main.c -L. -lmathutils -o app |
运行前指定库路径:
1 | LD_LIBRARY_PATH=. ./app |
查看程序依赖了哪些动态库:
1 | ldd ./app |
如果出现 not found,说明动态库搜索路径不正确。
十二、网络应用入门
Linux 网络应用常见方向:
- TCP 服务端。
- HTTP 服务。
- WebSocket 服务。
- 本地 Unix Domain Socket。
- 客户端工具。
入门建议先理解:
- IP 和端口。
- TCP 和 UDP。
- socket API。
- 阻塞和非阻塞 IO。
- select / poll / epoll。
查看监听端口:
1 | ss -lntp |
测试 TCP 连接:
1 | nc 127.0.0.1 8080 |
请求 HTTP 服务:
1 | curl http://127.0.0.1:8080 |
网络程序排错常用工具:
curl:测试 HTTP。nc:测试 TCP / UDP。ss:查看端口。tcpdump:抓包。strace:看系统调用。
十三、后台服务和 systemd
如果程序需要开机启动、异常重启、统一日志管理,可以使用 systemd。
示例服务文件:
1 | [Unit] |
保存为:
1 | /etc/systemd/system/my_app.service |
加载:
1 | sudo systemctl daemon-reload |
启动:
1 | sudo systemctl start my_app |
设置开机启动:
1 | sudo systemctl enable my_app |
查看状态:
1 | systemctl status my_app |
查看日志:
1 | journalctl -u my_app -f |
十四、打包和发布
14.1 简单发布
小工具可以直接发布可执行文件:
1 | scp ./app user@server:/usr/local/bin/app |
远端增加执行权限:
1 | chmod +x /usr/local/bin/app |
14.2 发布目录结构
更完整的发布结构:
1 | my_app/ |
压缩:
1 | tar -czf my_app.tar.gz my_app/ |
解压:
1 | tar -xzf my_app.tar.gz |
14.3 Debian 包
如果面向 Ubuntu / Debian 系统,后续可以学习 .deb 打包。入门阶段不必一开始就做包管理,先保证程序能稳定构建、运行、停止、重启、查看日志。
十五、常见问题
15.1 Permission denied
可能原因:
- 文件没有执行权限。
- 当前用户没有访问目录权限。
- 程序访问了需要 root 权限的资源。
检查:
1 | ls -l app |
处理:
1 | chmod +x app |
15.2 command not found
可能原因:
- 程序不在 PATH 中。
- 当前目录没有使用
./。
运行当前目录程序:
1 | ./app |
查看 PATH:
1 | echo $PATH |
15.3 cannot open shared object file
动态库找不到。
检查:
1 | ldd ./app |
临时解决:
1 | LD_LIBRARY_PATH=/path/to/lib ./app |
长期解决:
- 把库安装到系统库目录。
- 配置
/etc/ld.so.conf.d/。 - 使用 rpath。
- 发布时带上运行脚本设置库路径。
15.4 Segmentation fault
常见原因:
- 空指针。
- 数组越界。
- 使用已经释放的内存。
- 栈溢出。
- 错误的类型转换。
排查:
1 | gcc main.c -o app -Wall -Wextra -g |
15.5 端口被占用
检查端口:
1 | ss -lntp | grep 8080 |
找到进程后决定是否关闭:
1 | kill <pid> |
十六、学习路线
建议按这个顺序学习:
- Linux 基础命令:
cd、ls、cp、mv、rm、find、grep、sed、awk。 - Shell 基础:变量、管道、重定向、脚本、退出码。
- C 语言基础:指针、结构体、内存管理、文件 IO。
- 编译工具:GCC、Makefile、CMake。
- 调试工具:GDB、strace、lsof、valgrind。
- 系统编程:进程、线程、信号、IPC、socket。
- 服务化:日志、配置、systemd、权限隔离。
- 发布部署:压缩包、动态库依赖、deb/rpm、容器。
- 性能优化:top、perf、火焰图、内存分析。
- 工程化:单元测试、CI、代码规范、版本管理。
十七、入门项目练习
可以从这些小项目开始:
- 写一个命令行计算器。
- 写一个日志切分工具。
- 写一个文件搜索工具。
- 写一个 TCP echo server。
- 写一个 HTTP 静态文件服务。
- 写一个定时执行任务的小服务。
- 写一个读取配置文件并输出日志的后台进程。
每个项目都尽量做到:
- 支持命令行参数。
- 有清晰的错误提示。
- 有 README。
- 可以使用 Makefile 或 CMake 构建。
- 可以用 GDB 调试。
- 可以打包发布。
十八、总结
Linux 应用开发入门不要只看语法,要尽快把程序放到真实 Linux 环境中编译、运行、调试和部署。最小闭环是:
1 | 写代码 -> 编译 -> 运行 -> 出错 -> 调试 -> 修复 -> 打包 -> 部署 -> 查看日志 |
把这个闭环跑熟之后,再深入学习网络编程、多线程、性能优化和系统服务化,Linux 应用开发的基础就比较扎实了。
- 本文链接: https://blog.hansong.icu/2026/06/21/Linux_App_Development/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。