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

# vmsplice(2)

splice user pages to/from a pipe

## NAME

vmsplice - splice user pages to/from a pipe

## LIBRARY

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

## SYNOPSIS

```
#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <fcntl.h>
```

**ssize\_t vmsplice(int** *fd***, const struct iovec \****iov***,**                  **size\_t** *nr\_segs***, unsigned int** *flags***);**

## DESCRIPTION

If *fd* is opened for writing, the **vmsplice**() system call maps *nr\_segs* ranges of user memory described by *iov* into a pipe. If *fd* is opened for reading, the **vmsplice**() system call fills *nr\_segs* ranges of user memory described by *iov* from a pipe. The file descriptor *fd* must refer to a pipe.

The pointer *iov* points to an array of *iovec* structures as described in [**iovec**(3type)](/iovec/3type.md).

The *flags* argument is a bit mask that is composed by ORing together zero or more of the following values:

- **SPLICE\_F\_MOVE**

  Unused for **vmsplice**(); see [**splice**(2)](/splice/2.md).

- **SPLICE\_F\_NONBLOCK**

  Do not block on I/O; see [**splice**(2)](/splice/2.md) for further details.

- **SPLICE\_F\_MORE**

  Currently has no effect for **vmsplice**(), but may be implemented in the future; see [**splice**(2)](/splice/2.md).

- **SPLICE\_F\_GIFT**

  The user pages are a gift to the kernel. The application may not modify this memory ever, otherwise the page cache and on-disk data may differ. Gifting pages to the kernel means that a subsequent [**splice**(2)](/splice/2.md) **SPLICE\_F\_MOVE** can successfully move the pages; if this flag is not specified, then a subsequent [**splice**(2)](/splice/2.md) **SPLICE\_F\_MOVE** must copy the pages. Data must also be properly page aligned, both in memory and length.

## RETURN VALUE

Upon successful completion, **vmsplice**() returns the number of bytes transferred to the pipe. On error, **vmsplice**() returns -1 and *errno* is set to indicate the error.

## ERRORS

- **EAGAIN**

  **SPLICE\_F\_NONBLOCK** was specified in *flags*, and the operation would block.

- **EBADF**

  *fd* either not valid, or doesn't refer to a pipe.

- **EINVAL**

  *nr\_segs* is greater than **IOV\_MAX**; or memory not aligned if **SPLICE\_F\_GIFT** set.

- **ENOMEM**

  Out of memory.

## STANDARDS

Linux.

## HISTORY

Linux 2.6.17, glibc 2.5.

## NOTES

**vmsplice**() follows the other vectorized read/write type functions when it comes to limitations on the number of segments being passed in. This limit is **IOV\_MAX** as defined in *\<limits.h\>*. Currently, this limit is 1024.

**vmsplice**() really supports true splicing only from user memory to a pipe. In the opposite direction, it actually just copies the data to user space. But this makes the interface nice and symmetric and enables people to build on **vmsplice**() with room for future improvement in performance.

## SEE ALSO

[**splice**(2)](/splice/2.md), [**tee**(2)](/tee/2.md), [**pipe**(7)](/pipe/7.md)
