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() 可能会失败并设置 errnoread(2) 或 lseek(2) 中指定的任何错误。pwrite() 可能会失败并设置 errnowrite(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)

引用自

cpuid(4), explain(1), explain(3), explain_pread(3), explain_pread_or_die(3), fio(1), guestfish(1), guestfs(3), socket(7), spufs(2), spufs(7), writev(2), xfs_io(8)