vmsplice(2) - Linux man page
Name
vmsplice - splice user pages into a pipe
Synopsis
#define _GNU_SOURCE #include <fcntl.h> #include <sys/uio.h> long vmsplice(int fd, const struct iovec *iov, unsigned long nr_segs, unsigned int flags);
Description
The vmsplice() system call maps nr_segs ranges of user memory described by iov into a pipe. The file descriptor fd must refer to a pipe.
The pointer iov points to an array of iovec structures as defined in <sys/uio.h>:
-
struct iovec { void *iov_base; /* Starting address */ size_t iov_len; /* Number of bytes */ };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_F_NONBLOCK
Do not block on I/O; see splice(2) for further details.
SPLICE_F_MORE
Currently has no effect for vmsplice(), but may be implemented in the future; see splice(2).
SPLICE_F_GIFT
The user pages are a gift to the kernel. The application may not modify this memory ever, or page cache and on-disk data may differ. Gifting pages to the kernel means that a subsequent splice() SPLICE_F_MOVE can successfully move the pages; if this flag is not specified, then a subsequent splice() SPLICE_F_MOVE must copy the pages. Data must also be properly page aligned, both in memory and length.
- SPLICE_F_MOVE
Return Value
Upon successful completion, vmsplice() returns the number of bytes transferred to the pipe. On error, vmplice() returns -1 and errno is set to indicate the error.
Errors
- EBADF
fd either not valid, or doesn't refer to a pipe.
EINVAL
nr_segs is 0 or greater than IOV_MAX; or memory not aligned if SPLICE_F_GIFT set.
ENOMEM
Out of memory.
Notes
vmsplice() follows the other vectorized read/write type functions when it comes to limitations on number of segments being passed in. This limit is IOV_MAX as defined in <limits.h>. At the time of this writing, that limit is 1024.
History
The vmsplice(2) system call first appeared in Linux-2.6.17.
Conforming To
This system call is Linux specific.
