上一篇我们梳理了 Linux 文件编程,包含标准 IO、文件 IO、目录操作、framebuffer 帧缓冲与日志模块。本篇继续往下学习多线程高级、IPC 进程间通信、Socket 网络编程、简单数据库开发,把 Linux 应用开发四大模块补全。
回顾前文要点速览
文件编程两大体系:
进程:资源分配最小单位;线程:CPU 调度最小单位。 进程拥有完整独立虚拟地址空间;同一进程内多个线程共享堆、全局数据、代码段,每个线程私有栈。
一、多线程高级知识点
1. 线程基础函数回顾
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
编译必须加 -pthread 参数。
线程退出、资源回收
⚠️注意:主线程如果return / exit(),整个进程所有线程全部销毁;主线程调用pthread_exit(),主线程退出,其他子线程可以继续运行。
2. 线程同步:互斥锁 pthread_mutex_t
多线程共享全局变量,会产生竞态条件(数据混乱)。互斥锁用来保护共享资源,保证同一时间只有一个线程访问临界资源。
核心 API:
pthread_mutex_init(); //初始化锁
pthread_mutex_lock(); //加锁,拿不到就阻塞
pthread_mutex_unlock(); //解锁
pthread_mutex_destroy();//销毁锁
使用范式:
pthread_mutex_t mutex;
//临界区开始
pthread_mutex_lock(&mutex);
//操作共享全局变量
pthread_mutex_unlock(&mutex);
//临界区结束
3. 条件变量 pthread_cond_t
互斥锁解决 “互斥访问”;条件变量解决线程等待 / 唤醒,生产者消费者模型必备。 常用接口:
pthread_cond_init();
pthread_cond_wait(); //释放锁并阻塞等待条件,被唤醒后重新获取锁
pthread_cond_signal(); //唤醒一个等待线程
pthread_cond_broadcast();//唤醒全部等待线程
pthread_cond_destroy();
经典模型:生产者往队列放数据,条件变量发信号;消费者cond_wait阻塞,收到信号读取队列。
4. 线程属性
- 分离属性:创建线程的时候设置分离属性,等价于pthread_detach;
- 栈大小:可以自定义线程栈空间,嵌入式开发常用。
进程 VS 线程完整对比
表格
| 调度单位 | 资源分配最小单位 | CPU 调度最小单位 |
| 内存空间 | 完全独立虚拟地址空间 | 共享进程资源,仅栈私有 |
| 创建开销 | 大,拷贝页表、内存 | 很小,仅分配线程栈 |
| 崩溃影响 | 一个进程崩溃互不干扰 | 一个线程崩溃,整个进程全部退出 |
| 通信方式 | IPC 管道、消息队列、共享内存、socket | 直接读写全局变量,配合锁与条件变量 |
坑点总结:
二、进程间通信 IPC
进程虚拟地址相互隔离,不能直接访问对方内存,必须借助内核提供 IPC 机制。
常见 IPC 方式:
1. 匿名管道 pipe
int pipe(int fd[2]);
// fd[0]读端,fd[1]写端
管道特点:
- 数据单向流动;读端关闭,写触发 SIGPIPE 信号;写端关闭,read 返回 0;
- 只适用于有亲缘关系进程。
2. 信号 signal
信号是软件中断。kill -l查看全部信号。 signal() / sigaction()注册信号处理函数。
注意:信号处理函数内部只允许调用可重入函数,不要使用 printf/malloc 等不安全函数。
3. 共享内存(最高速 IPC)
shmget() //创建/获取共享内存id
shmat() //映射到本进程虚拟地址
shmdt() //解除映射
shmctl() //控制、删除共享内存
共享内存没有自带同步,一定要搭配信号量或者互斥锁,否则多进程同时写会乱数据。
三、Linux 网络编程 Socket
一切皆文件,socket 也是一种文件描述符,可以用 read/write 读写。
TCP(面向连接,可靠流式)服务器开发流程
TCP 客户端流程:
UDP(无连接,数据报)
不需要 connect、listen、accept; 使用sendto()发送,recvfrom()接收,自带对端地址。
字节序大坑
网络统一使用大端字节序;主机可能小端。 转换函数: htons() htonl() ntohs() ntohl() h‑host 主机,n‑network 网络,s‑short,l‑long。
常用结构体:struct sockaddr_in IPv4 地址结构。
IO 模型(重点面试)
epoll 是 Linux 高性能网络核心,高并发服务器基石。
简单区分:
- select:文件描述有上限;
- poll:无上限,但每次全部遍历;
- epoll:事件驱动,只返回就绪 fd,百万并发首选。
服务器架构:单进程 epoll;多进程 fork;多线程。
四、Linux 下数据库编程 SQLite
嵌入式常用轻量数据库 SQLite,文件型数据库,不需要独立服务进程。
核心 API:
基础 SQL 语句:
CREATE TABLE user(id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO user(name) VALUES("zhangsan");
SELECT * FROM user;
UPDATE user set name="lisi" where id=1;
DELETE FROM user where id=1;
编译链接需要 -lsqlite3。
使用场景:本地配置存储、日志记录、嵌入式设备本地数据管理。
五、整套 Linux 应用开发知识总框架
学习实操建议
小结
进程和线程是多任务的两种实现,线程更轻量适合 CPU 密集、IO 密集并发;进程隔离性强,稳定性更高。进程间通信手段很多,追求速度优先选共享内存,跨机器通信就用 Socket 网络编程;结构化持久存储选择 SQLite 数据库。
网硕互联帮助中心






评论前必须登录!
注册