NO.13 · Linux 与工具
Linux 应用层开发:从文件 I/O 到 epoll 高并发
Linux 应用层开发笔记,覆盖 GCC 工具链与 Makefile、文件 I/O、进程与线程、IPC、TCP/UDP Socket 编程、守护进程与 select/poll/epoll 高并发模型。
在 Linux 上写 C 程序,是嵌入式工程师从”操作寄存器”走向”操作系统服务”的必经之路。这份笔记从 GCC 编译链接讲起,深入文件 I/O、进程线程、进程间通信、Socket 网络编程,最后到达 epoll 高并发服务器的完整实现。
学习路线
1 | Linux C 开发基础 |
内容概览
编译与构建
理解 GCC、glibc、GNU C 和 POSIX 的关系,掌握 C 语言从源文件到可执行文件的完整过程(预处理 → 编译 → 汇编 → 链接),使用 Makefile 管理编译目标、依赖关系和构建命令。
文件 I/O
区分面向流的标准 I/O(fopen/fread/fwrite)与面向文件描述符的系统 I/O(open/read/write),理解标准输入输出、文件描述符及其在进程中的引用关系。
进程处理
system创建子进程、fork理解父子进程执行流、execve替换进程映像、waitpid回收子进程;- 理解文件描述符引用计数、进程树和孤儿进程;
- 进程间通信:匿名管道(Pipe)、有名管道(FIFO)、共享内存、消息队列,以及信号处理例程。
线程处理
- 理解 Linux 线程模型与进程的关系,使用线程 API 创建和终止线程;
- 认识竞态条件,使用互斥锁、读写锁、自旋锁、条件变量和信号量完成同步;
- 使用 Glib 线程池组织任务执行和线程复用。
并发模型对比:
| 模型 | 主要特点 | 适用方向 |
|---|---|---|
| 单进程单线程 | 结构简单,资源开销小 | 简单命令行程序 |
| 多进程 | 地址空间隔离,故障影响小 | 独立任务和进程级隔离 |
| 多线程 | 共享地址空间,通信成本低 | 多连接服务、共享数据处理 |
| I/O 多路复用 | 一个执行流管理多个 I/O | 大量网络连接、事件驱动 |
Socket 编程
- 网络基础:OSI 七层、TCP/IP 四层模型,数据单元与以太网通信流程;
- TCP:报文段格式、连接建立与释放、可靠传输、滑动窗口和拥塞控制,实现只支持单连接的版本后,再用多线程和多进程扩展;
- UDP 与 Unix Domain Socket 本地进程间通信;
- 深入 IP 地址分类、DNS 查询过程、数据链路层、MAC 地址与 ARP。
守护进程与 I/O 多路复用
- 掌握创建守护进程的基本规则:脱离终端、处理文件描述符、日志记录与优雅关闭;
- 对比
select(fd 集合)、poll(事件数组)和epoll(事件通知)的工作方式; - 理解
epoll的水平触发(LT)与边沿触发(ET)模式,ET 模式需要配合非阻塞 I/O 和持续读取策略。
常用 API 速查
| 领域 | 常用 API | 主要用途 |
|---|---|---|
| 文件描述符 | open、close、read、write |
系统调用方式访问文件 |
| 进程 | system、fork、execve、waitpid |
创建、替换和回收进程 |
| 线程 | pthread_create |
创建、控制和回收线程 |
| 同步 | 互斥锁、读写锁、条件变量、信号量 | 保护共享资源和协调执行 |
| TCP Socket | socket、bind、listen、accept、connect |
建立 TCP 网络通信 |
| UDP Socket | sendto、recvfrom |
实现无连接通信 |
| I/O 多路复用 | select、poll、epoll |
监听多个文件描述符 |
工程注意事项
- 共享内存、消息队列、管道和 Socket 使用后应及时释放或关闭资源;
- TCP 服务端应处理断开、短读、短写、缓冲区边界和异常连接;
- 多线程程序需要明确共享数据、锁的所有权、等待条件和退出流程;
- 每个系统调用都记录返回值、错误处理、资源释放和并发安全要求。
学习建议
- 先掌握 GCC、编译链接流程和 Makefile,再学习 Linux 系统接口;
- 按
fork、execve、waitpid的顺序理解进程创建和执行; - 先掌握管道和共享内存,再学习消息队列、信号和更复杂的 IPC;
- 网络部分先理解 TCP 状态和 Socket API,再对比多进程、多线程和 I/O 多路复用服务器。