第2周:Linux 进程与线程模型
目标:理解进程生命周期、信号处理、线程同步,能够编写多线程网络服务程序。
1. 进程模型
1.1 fork / exec / waitpid
1 |
|
fork 之后父子进程的关系:
| 特性 | 说明 |
|---|---|
| 代码段 | 共享(只读,通过写时拷贝 COW) |
| 数据段/堆/栈 | 各自独立(COW,修改时才复制) |
| 文件描述符 | 共享(指向同一打开文件表项,偏移共享) |
| PID | 不同 |
| 返回值 | 父进程返回子 PID,子进程返回 0 |
写时拷贝(COW):
1 |
|
1.2 exec 系列函数
1 | execl(path, arg0, arg1, ..., NULL) // 路径 + 参数列表 |
1 |
|
1.3 守护进程(Daemon)
1 |
|
2. 进程间通信(IPC)
2.1 管道(Pipe)
1 |
|
2.2 FIFO(命名管道)
1 |
|
2.3 共享内存(System V + POSIX)
1 | // POSIX 共享内存(推荐) |
2.4 信号量(POSIX)
1 |
|
3. 信号处理
3.1 signal / sigaction
1 |
|
3.2 SIGPIPE —— 必须掌握!
1 |
|
SIGPIPE 产生场景:向一个已经被对方关闭的 TCP 连接写入数据时,默认会触发 SIGPIPE 信号导致进程终止。必须忽略 SIGPIPE 并通过 write 的返回值检查 EPIPE。
3.3 信号集与 sigprocmask
1 |
|
4. 线程模型(pthread)
4.1 基本线程操作
1 |
|
4.2 线程同步
互斥锁(Mutex)
1 |
|
条件变量(Condition Variable)
1 |
|
⚠️ 条件变量使用陷阱:
- 必须在循环中检查条件(虚假唤醒问题)
- 必须在 mutex 保护下检查条件
pthread_cond_wait会自动释放 mutex,返回时重新获取
读写锁(RWLock)
1 |
|
4.3 线程安全队列
1 | // thread_queue.h |
1 | // thread_queue.c |
4.4 线程属性与 detached 状态
1 |
|
5. 实践:多线程文件传输工具
1 | // mt_transfer.c |
1 | gcc -o mt_transfer mt_transfer.c thread_queue.c -lpthread |
6. 实战要点总结
| 概念 | 关键点 |
|---|---|
| fork | 父进程返回子 PID,子进程返回 0;COW 机制 |
| exec | 替换当前进程映像,不返回(失败才返回) |
| waitpid | 阻塞/非阻塞回收子进程,获取退出状态 |
| 信号 | 异步通知机制;SIGPIPE 必须忽略 |
| Mutex | 互斥访问,防止数据竞争 |
| CondVar | 等待条件满足,避免忙轮询 |
| 线程安全队列 | Mutex + CondVar 是标准实现 |
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/08/03/第2周:Linux 进程与线程模型/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!