---
name: "pread"
section: "2"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/pread"
---

# pread(2)

read from or write to a file descriptor at a given offset

## NAME

pread, pwrite - read from or write to a file descriptor at a given offset

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <unistd.h>
```

**ssize\_t pread(**size\_t count;               **int** *fd***, void** *buf***\[***count***\], size\_t** *count***,**               **off\_t** *offset***);** **ssize\_t pwrite(**size\_t count;               **int** *fd***, const void** *buf***\[***count***\], size\_t** *count***,**               **off\_t** *offset***);**

Feature Test Macro Requirements for glibc (see [**feature\_test\_macros**(7)](/feature_test_macros/7.md)):

**pread**(), **pwrite**():

```
    _XOPEN_SOURCE >= 500
        || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
```

## DESCRIPTION

**pread**() reads up to *count* bytes from file descriptor *fd* at offset *offset* (from the start of the file) into the buffer starting at *buf*. The file offset is not changed.

**pwrite**() writes up to *count* bytes from the buffer starting at *buf* to the file descriptor *fd* at offset *offset*. The file offset is not changed.

The file referenced by *fd* must be capable of seeking.

## RETURN VALUE

On success, **pread**() returns the number of bytes read (a return of zero indicates end of file) and **pwrite**() returns the number of bytes written.

Note that it is not an error for a successful call to transfer fewer bytes than requested (see [**read**(2)](/read/2.md) and [**write**(2)](/write/2.md)).

On error, -1 is returned and *errno* is set to indicate the error.

## ERRORS

**pread**() can fail and set *errno* to any error specified for [**read**(2)](/read/2.md) or [**lseek**(2)](/lseek/2.md). **pwrite**() can fail and set *errno* to any error specified for [**write**(2)](/write/2.md) or [**lseek**(2)](/lseek/2.md).

## STANDARDS

POSIX.1-2024.

## HISTORY

POSIX.1-2001.

Added in Linux 2.1.60; the entries in the i386 system call table were added in Linux 2.1.69. C library support (including emulation using [**lseek**(2)](/lseek/2.md) on older kernels without the system calls) was added in glibc 2.1.

### C library/kernel differences

On Linux, the underlying system calls were renamed in Linux 2.6: **pread**() became **pread64**(), and **pwrite**() became **pwrite64**(). The system call numbers remained the same. The glibc **pread**() and **pwrite**() wrapper functions transparently deal with the change.

On some 32-bit architectures, the calling signature for these system calls differ, for the reasons described in [**syscall**(2)](/syscall/2.md).

## NOTES

The **pread**() and **pwrite**() system calls are especially useful in multithreaded applications. They allow multiple threads to perform I/O on the same file descriptor without being affected by changes to the file offset by other threads.

## BUGS

POSIX requires that opening a file with the **O\_APPEND** flag should have no effect on the location at which **pwrite**() writes data. However, on Linux, if a file is opened with **O\_APPEND**, **pwrite**() appends data to the end of the file, regardless of the value of *offset*.

## SEE ALSO

[**lseek**(2)](/lseek/2.md), [**read**(2)](/read/2.md), [**readv**(2)](/readv/2.md), [**write**(2)](/write/2.md)
