---
name: "io_uring_prep_readv_fixed"
section: "3"
platform: "linux"
package: "liburing"
version: "2.15-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/io_uring_prep_readv_fixed"
---

# io\_uring\_prep\_readv\_fixed(3)

prepare a vectored read using fixed buffers

## NAME

io\_uring\_prep\_readv\_fixed - prepare a vectored read using fixed buffers

## SYNOPSIS

```
#include <liburing.h>
```

**void io\_uring\_prep\_readv\_fixed(struct io\_uring\_sqe \****sqe***,**                                **int** *fd***,**                                **const struct iovec \****iovecs***,**                                **unsigned** *nr\_vecs***,**                                **\_\_u64** *offset***,**                                **int** *flags***,**                                **int** *buf\_index***);**

## DESCRIPTION

The [**io\_uring\_prep\_readv\_fixed**(3)](/io_uring_prep_readv_fixed/3.md) function prepares a vectored read request using fixed (registered) buffers. The submission queue entry *sqe* is setup to use the file descriptor *fd* to start reading *nr\_vecs* iovecs from the file position *offset*.

The *iovecs* argument points to an array of iovec structures describing the read buffers. All buffers must be part of the registered buffer set at index *buf\_index*, previously registered with [**io\_uring\_register\_buffers**(3)](/io_uring_register_buffers/3.md).

The *flags* argument can contain any per-request flags, such as **RWF\_NOWAIT** or other flags supported by [**preadv2**(2)](/preadv2/2.md).

Using fixed buffers avoids the overhead of mapping buffers for each I/O operation, improving performance for applications that reuse the same buffers.

## RETURN VALUE

None

## ERRORS

The CQE *res* field will contain the result of the operation, the number of bytes read on success. On error, a negative errno value is returned.

## NOTES

This function accepts an array of iovec's with a size\_t number of bytes each, but io\_uring\_cqe's result code is an \_\_s32 value, so in theory a short read with a large enough iov\_len value could generate an ambiguous return. But the number of bytes actually transferred has the same limit as [**read**(2)](/read/2.md) so this cannot happen in practice.

## SEE ALSO

[**io\_uring\_get\_sqe**(3)](/io_uring_get_sqe/3.md), [**io\_uring\_submit**(3)](/io_uring_submit/3.md), [**io\_uring\_prep\_readv**(3)](/io_uring_prep_readv/3.md), [**io\_uring\_prep\_readv2**(3)](/io_uring_prep_readv2/3.md), [**io\_uring\_prep\_read\_fixed**(3)](/io_uring_prep_read_fixed/3.md), [**io\_uring\_prep\_writev\_fixed**(3)](/io_uring_prep_writev_fixed/3.md), [**io\_uring\_register\_buffers**(3)](/io_uring_register_buffers/3.md)
