---
name: "io_uring_prep_sendmsg_zc_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_sendmsg_zc_fixed"
---

# io\_uring\_prep\_sendmsg\_zc\_fixed(3)

prepare a zero-copy sendmsg using fixed buffers

## NAME

io\_uring\_prep\_sendmsg\_zc\_fixed - prepare a zero-copy sendmsg using fixed buffers

## SYNOPSIS

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

**void io\_uring\_prep\_sendmsg\_zc\_fixed(struct io\_uring\_sqe \****sqe***,**                                     **int** *fd***,**                                     **const struct msghdr \****msg***,**                                     **unsigned** *flags***,**                                     **unsigned** *buf\_index***);**

## DESCRIPTION

The [**io\_uring\_prep\_sendmsg\_zc\_fixed**(3)](/io_uring_prep_sendmsg_zc_fixed/3.md) function prepares a zero-copy sendmsg request using fixed (registered) buffers. The submission queue entry *sqe* is setup to send data on the socket indicated by the file descriptor *fd* using the message structure *msg*.

The *flags* argument contains flags for the sendmsg operation, as described in [**sendmsg**(2)](/sendmsg/2.md).

The *buf\_index* specifies the index of the registered buffer set to use. The buffers in *msg* must be part of the registered buffer set previously registered with [**io\_uring\_register\_buffers**(3)](/io_uring_register_buffers/3.md).

Zero-copy sends avoid copying data from user to kernel space, improving performance for large transfers. Using fixed buffers additionally avoids the overhead of mapping buffers for each I/O operation.

Note that zero-copy sends require the application to wait for a notification before reusing the buffer. See [**io\_uring\_prep\_send\_zc**(3)](/io_uring_prep_send_zc/3.md) for more details on zero-copy semantics.

## RETURN VALUE

None

## ERRORS

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

Despite accepting an array of iovec's with a size\_t number of bytes each, this function can transfer at most INT\_MAX bytes per call (the maximum for the underlying syscall interface).

## 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\_sendmsg\_zc**(3)](/io_uring_prep_sendmsg_zc/3.md), [**io\_uring\_prep\_sendmsg**(3)](/io_uring_prep_sendmsg/3.md), [**io\_uring\_prep\_send\_zc\_fixed**(3)](/io_uring_prep_send_zc_fixed/3.md), [**io\_uring\_register\_buffers**(3)](/io_uring_register_buffers/3.md), [**sendmsg**(2)](/sendmsg/2.md)
