跳到正文
XiaoGao 的个人博客

NO.13 · Linux 与工具

Linux 应用层开发:从文件 I/O 到 epoll 高并发

Linux 应用层开发笔记,覆盖 GCC 工具链与 Makefile、文件 I/O、进程与线程、IPC、TCP/UDP Socket 编程、守护进程与 select/poll/epoll 高并发模型。

发布 DATE
字数 WORDS
1,190
阅读 READ
3 分钟

在 Linux 上写 C 程序,是嵌入式工程师从”操作寄存器”走向”操作系统服务”的必经之路。这份笔记从 GCC 编译链接讲起,深入文件 I/O、进程线程、进程间通信、Socket 网络编程,最后到达 epoll 高并发服务器的完整实现。

学习路线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Linux C 开发基础
├── GCC、glibc、GNU C 和 POSIX
├── VSCode 与 GCC 开发环境
├── C 语言编译、汇编和链接
└── Makefile
↓
Linux 系统接口
├── 标准 I/O 与文件操作
├── 系统调用
└── 文件描述符
↓
并发与进程间通信
├── 进程创建与执行
├── 管道、共享内存、消息队列
├── 信号
├── 线程和线程同步
└── 线程池
↓
网络应用开发
├── TCP/IP 网络模型
├── TCP、UDP 和 Unix Domain Socket
├── 单连接、多进程和多线程服务器
└── IP、DNS、ARP、MAC 和物理层
↓
服务化与高并发
├── 守护进程
└── select、poll、epoll

内容概览

编译与构建

理解 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 服务端应处理断开、短读、短写、缓冲区边界和异常连接;
  • 多线程程序需要明确共享数据、锁的所有权、等待条件和退出流程;
  • 每个系统调用都记录返回值、错误处理、资源释放和并发安全要求。

学习建议

  1. 先掌握 GCC、编译链接流程和 Makefile,再学习 Linux 系统接口;
  2. 按 fork、execve、waitpid 的顺序理解进程创建和执行;
  3. 先掌握管道和共享内存,再学习消息队列、信号和更复杂的 IPC;
  4. 网络部分先理解 TCP 状态和 Socket API,再对比多进程、多线程和 I/O 多路复用服务器。

仓库

    ↑↓ 选择↵ 打开>theme · >random · >top · >archive