pread(2) - Linux man page
名称
pread, pwrite - 在给定偏移量处从文件描述符读取或写入
概要
#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
glibc 的功能测试宏要求(参见 feature_test_macros(7))
- pread(), pwrite()
- _XOPEN_SOURCE >= 500
|| /* 自 glibc 2.12 起: */ _POSIX_C_SOURCE >= 200809L
描述
pread() 从文件描述符 fd 在偏移量 offset(从文件开始处)读取最多 count 字节到以 buf 开头的缓冲区。文件偏移量不会改变。
pwrite() 将以 buf 开头的缓冲区中的最多 count 字节写入到文件描述符 fd 在偏移量 offset 处。文件偏移量不会改变。
由 fd 引用的文件必须能够进行寻址。
返回值
成功时,返回读取或写入的字节数(零表示未写入任何内容,在 pwrite() 的情况下,或者文件结束,在 pread() 的情况下),或者在出错时返回 -1,此时 errno 会被设置为指示错误。
错误
pread() 可能会失败并设置 errno 为 read(2) 或 lseek(2) 中指定的任何错误。pwrite() 可能会失败并设置 errno 为 write(2) 或 lseek(2) 中指定的任何错误。
版本
pread() 和 pwrite() 系统调用是在 Linux 2.1.60 版本中添加的;i386 系统调用表中的条目是在 2.1.69 中添加的。C 库支持(包括使用 lseek(2) 在较旧的内核上模拟系统调用,这些内核没有系统调用)是在 glibc 2.1 中添加的。
符合
POSIX.1-2001。
说明
在 Linux 上,底层系统调用在内核 2.6 中被重命名:pread() 变为 pread64(),pwrite() 变为 pwrite64()。系统调用号保持不变。glibc pread() 和 pwrite() 包装函数会透明地处理此更改。
错误
POSIX 要求使用 O_APPEND 标志打开的文件不应影响 pwrite() 写入数据的的位置。但是,在 Linux 上,如果文件使用 O_APPEND 打开,pwrite() 会将数据附加到文件末尾,而不管 offset 的值如何。
参见
lseek(2), read(2), readv(2), write(2)