io\_uring\_prep\_sendmsg\_zc\_fixed(3) liburing Manual io\_uring\_prep\_sendmsg\_zc\_fixed(3)

# [NAME](#NAME)

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

# [SYNOPSIS](#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](#DESCRIPTION)

The [**io\_uring\_prep\_sendmsg\_zc\_fixed**(3)](/man/os/liburing/io_uring_prep_sendmsg_zc_fixed.3) 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)](/man/os/liburing/sendmsg.2).

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)](/man/os/liburing/io_uring_register_buffers.3).

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)](/man/os/liburing/io_uring_prep_send_zc.3) for more details on zero-copy semantics.

# [RETURN VALUE](#RETURN_VALUE)

None

# [ERRORS](#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](#SEE_ALSO)

[**io\_uring\_get\_sqe**(3)](/man/os/liburing/io_uring_get_sqe.3), [**io\_uring\_submit**(3)](/man/os/liburing/io_uring_submit.3), [**io\_uring\_prep\_sendmsg\_zc**(3)](/man/os/liburing/io_uring_prep_sendmsg_zc.3), [**io\_uring\_prep\_sendmsg**(3)](/man/os/liburing/io_uring_prep_sendmsg.3), [**io\_uring\_prep\_send\_zc\_fixed**(3)](/man/os/liburing/io_uring_prep_send_zc_fixed.3), [**io\_uring\_register\_buffers**(3)](/man/os/liburing/io_uring_register_buffers.3), [**sendmsg**(2)](/man/os/liburing/sendmsg.2)

January 18, 2025 liburing-2.10

---

Document: io_uring_prep_sendmsg_zc_fixed(3) from liburing 2.15-r5 (Chainguard OS)
Source: https://github.com/axboe/liburing.git
