- 概述
这些是 Linux 系统中一组高级 I/O 操作系统调用,它们提供了比传统 read/write 更强大和灵活的功能。每种调用都有其特定的用途和优势。
- 系统调用详细介绍
2.1 pread/pwrite - 位置指定读写
1 | #include <unistd.h> |
功能:
pread: 从指定位置读取数据,不改变文件指针位置
pwrite: 向指定位置写入数据,不改变文件指针位置
优势:
原子操作(读/写 + 位置指定)
线程安全
不影响其他读写操作
示例:
1 | #include <stdio.h> |
2.2 preadv/pwritev - 分散/聚集 I/O
1 | #include <sys/uio.h> |
功能:
preadv: 从指定位置读取到多个缓冲区(分散读取)
pwritev: 从多个缓冲区写入到指定位置(聚集写入)
iov 结构体:
1 | struct iovec { |
示例:
1 | #include <stdio.h> |
2.3 preadv2/pwritev2 - 增强版分散/聚集 I/O
1 | #define _GNU_SOURCE |
功能:
在 preadv/pwritev 基础上增加标志控制
支持更细粒度的 I/O 控制
支持的标志:
RWF_HIPRI: 高优先级 I/O
RWF_DSYNC: 数据同步写入
RWF_SYNC: 同步写入
RWF_NOWAIT: 非阻塞操作
RWF_APPEND: 追加模式
示例:
1 | #define _GNU_SOURCE |
2.4 prlimit64 - 资源限制控制
1 | #include <sys/resource.h> |
功能:
获取和设置进程资源限制
支持 64 位资源限制值
可以操作其他进程的资源限制
常用资源类型:
RLIMIT_AS: 虚拟内存地址空间限制
RLIMIT_CORE: 核心转储文件大小限制
RLIMIT_CPU: CPU 时间限制
RLIMIT_DATA: 数据段大小限制
RLIMIT_FSIZE: 文件大小限制
RLIMIT_NOFILE: 打开文件描述符数量限制
RLIMIT_NPROC: 进程数量限制
RLIMIT_STACK: 栈大小限制
示例:
1 | #include <stdio.h> |
- 性能对比测试
1 | #include <stdio.h> |
- 实际应用场景
4.1 数据库存储引擎
1 | #include <stdio.h> |
4.2 网络协议处理
1 | #include <sys/uio.h> |
- 编译和运行
1 | # 编译示例 |
- 使用建议
6.1 选择指南
场景推荐函数原因简单顺序读写read/write简单直接随机位置访问pread/pwrite原子操作,线程安全多缓冲区操作readv/writev减少系统调用位置+多缓冲区preadv/pwritev功能最强需要高级控制preadv2/pwritev2支持标志控制资源限制管理prlimit64专门用途
6.2 最佳实践
1 | // 安全的 pread 封装 |
这些高级 I/O 系统调用为 Linux 应用程序提供了强大而灵活的文件操作能力,正确使用它们可以显著提高程序的性能和可靠性。