2006-09-18 12:35:34 +00:00
|
|
|
.\" Hey Emacs! This file is -*- nroff -*- source.
|
|
|
|
.\"
|
|
|
|
.\" This manpage is Copyright (C) 2006 Jens Axboe
|
|
|
|
.\" and Copyright (C) 2006 Michael Kerrisk <mtk-manpages@gmx.net>
|
|
|
|
.\"
|
|
|
|
.\" Permission is granted to make and distribute verbatim copies of this
|
|
|
|
.\" manual provided the copyright notice and this permission notice are
|
|
|
|
.\" preserved on all copies.
|
|
|
|
.\"
|
|
|
|
.\" Permission is granted to copy and distribute modified versions of this
|
|
|
|
.\" manual under the conditions for verbatim copying, provided that the
|
|
|
|
.\" entire resulting derived work is distributed under the terms of a
|
|
|
|
.\" permission notice identical to this one.
|
2007-04-12 22:42:49 +00:00
|
|
|
.\"
|
2006-09-18 12:35:34 +00:00
|
|
|
.\" Since the Linux kernel and libraries are constantly changing, this
|
|
|
|
.\" manual page may be incorrect or out-of-date. The author(s) assume no
|
|
|
|
.\" responsibility for errors or omissions, or for damages resulting from
|
|
|
|
.\" the use of the information contained herein. The author(s) may not
|
|
|
|
.\" have taken the same level of care in the production of this manual,
|
|
|
|
.\" which is licensed free of charge, as they might when working
|
|
|
|
.\" professionally.
|
2007-04-12 22:42:49 +00:00
|
|
|
.\"
|
2006-09-18 12:35:34 +00:00
|
|
|
.\" Formatted or processed versions of this manual, if unaccompanied by
|
|
|
|
.\" the source, must acknowledge the copyright and authors of this work.
|
|
|
|
.\"
|
|
|
|
.TH splice 2 2006-04-28 "Linux 2.6.17" "Linux Programmer's Manual"
|
|
|
|
.SH NAME
|
|
|
|
splice \- splice data to/from a pipe
|
|
|
|
.SH SYNOPSIS
|
|
|
|
.nf
|
|
|
|
.B #define _GNU_SOURCE
|
|
|
|
.B #include <fcntl.h>
|
|
|
|
|
2007-04-12 22:42:49 +00:00
|
|
|
.BI "long splice(int " fd_in ", off_t *" off_in ", int " fd_out ,
|
2006-09-18 12:35:34 +00:00
|
|
|
.BI " off_t *" off_out ", size_t " len \
|
|
|
|
", unsigned int " flags );
|
|
|
|
.fi
|
|
|
|
.SH DESCRIPTION
|
|
|
|
.BR splice ()
|
2007-04-12 22:42:49 +00:00
|
|
|
moves data between two file descriptors
|
2006-09-18 12:35:34 +00:00
|
|
|
without copying between kernel address space and user address space.
|
|
|
|
It transfers up to
|
|
|
|
.I len
|
|
|
|
bytes of data from the file descriptor
|
|
|
|
.I fd_in
|
|
|
|
to the file descriptor
|
|
|
|
.IR fd_out ,
|
2007-04-12 22:42:49 +00:00
|
|
|
where one of the descriptors must refer to a pipe.
|
2006-09-18 12:35:34 +00:00
|
|
|
|
|
|
|
If
|
2007-03-18 06:20:17 +00:00
|
|
|
.I fd_in
|
2006-09-18 12:35:34 +00:00
|
|
|
refers to a pipe, then
|
2007-04-12 22:42:49 +00:00
|
|
|
.I off_in
|
2006-09-18 12:35:34 +00:00
|
|
|
must be NULL.
|
|
|
|
If
|
2007-04-12 22:42:49 +00:00
|
|
|
.I fd_in
|
2006-09-18 12:35:34 +00:00
|
|
|
does not refer to a pipe and
|
2007-03-18 06:20:17 +00:00
|
|
|
.I off_in
|
2007-04-12 22:42:49 +00:00
|
|
|
is NULL, then bytes are read from
|
2007-03-18 06:20:17 +00:00
|
|
|
.I fd_in
|
2006-09-18 12:35:34 +00:00
|
|
|
starting from the current file offset,
|
|
|
|
and the current file offset is adjusted appropriately.
|
|
|
|
If
|
2007-04-12 22:42:49 +00:00
|
|
|
.I fd_in
|
2006-09-18 12:35:34 +00:00
|
|
|
does not refer to a pipe and
|
2007-03-18 06:20:17 +00:00
|
|
|
.I off_in
|
2007-04-12 22:42:49 +00:00
|
|
|
is not NULL, then
|
2007-03-18 06:20:17 +00:00
|
|
|
.I off_in
|
2006-09-18 12:35:34 +00:00
|
|
|
must point to a buffer which specifies the starting
|
|
|
|
offset from which bytes will be read from
|
2007-03-18 06:20:17 +00:00
|
|
|
.IR fd_in ;
|
2006-09-18 12:35:34 +00:00
|
|
|
in this case, the current file offset of
|
2007-04-12 22:42:49 +00:00
|
|
|
.IR fd_in
|
2006-09-18 12:35:34 +00:00
|
|
|
is not changed.
|
|
|
|
Analogous statements apply for
|
|
|
|
.I out_fd
|
|
|
|
and
|
2007-03-18 06:20:17 +00:00
|
|
|
.IR off_out .
|
2006-09-18 12:35:34 +00:00
|
|
|
|
|
|
|
The
|
|
|
|
.I flags
|
|
|
|
argument is a bit mask that is composed by ORing together
|
|
|
|
zero or more of the following values:
|
|
|
|
.TP 1.9i
|
|
|
|
.B SPLICE_F_MOVE
|
2007-04-12 22:42:49 +00:00
|
|
|
Attempt to move pages instead of copying.
|
2006-09-18 12:35:34 +00:00
|
|
|
This is only a hint to the kernel:
|
2007-04-12 22:42:49 +00:00
|
|
|
pages may still be copied if the kernel cannot move the
|
2006-09-18 12:35:34 +00:00
|
|
|
pages from the pipe, or if
|
|
|
|
the pipe buffers don't refer to full pages.
|
|
|
|
.TP
|
|
|
|
.B SPLICE_F_NONBLOCK
|
|
|
|
Do not block on I/O.
|
2007-04-12 22:42:49 +00:00
|
|
|
This makes the splice pipe operations non-blocking, but
|
2006-09-18 12:35:34 +00:00
|
|
|
.BR splice ()
|
|
|
|
may nevertheless block because the file descriptors that
|
|
|
|
are spliced to/from may block (unless they have the
|
|
|
|
.BR O_NONBLOCK
|
|
|
|
flag set).
|
|
|
|
.TP
|
|
|
|
.B SPLICE_F_MORE
|
|
|
|
More data will be coming in a subsequent splice.
|
|
|
|
This is a helpful hint when
|
2007-04-12 22:42:49 +00:00
|
|
|
the
|
2006-09-18 12:35:34 +00:00
|
|
|
.I fd_out
|
|
|
|
refers to a socket (see also the description of
|
|
|
|
.B MSG_MORE
|
|
|
|
in
|
|
|
|
.BR send (2),
|
|
|
|
and the description of
|
|
|
|
.B TCP_CORK
|
|
|
|
in
|
|
|
|
.BR tcp (7))
|
|
|
|
.TP
|
|
|
|
.B SPLICE_F_GIFT
|
|
|
|
Unused for
|
|
|
|
.BR splice ();
|
|
|
|
see
|
|
|
|
.BR vmsplice (2).
|
|
|
|
.SH RETURN VALUE
|
|
|
|
Upon successful completion,
|
|
|
|
.BR splice ()
|
|
|
|
returns the number of bytes
|
2007-04-12 22:42:49 +00:00
|
|
|
spliced to or from the pipe.
|
|
|
|
A return value of 0 means that there was no data to transfer,
|
|
|
|
and it would not make sense to block, because there are no
|
|
|
|
writers connected to the write end of the pipe referred to by
|
2006-09-18 12:35:34 +00:00
|
|
|
.IR fd_in .
|
|
|
|
|
2007-04-12 22:42:49 +00:00
|
|
|
On error,
|
2006-09-18 12:35:34 +00:00
|
|
|
.BR splice ()
|
|
|
|
returns \-1 and
|
|
|
|
.I errno
|
|
|
|
is set to indicate the error.
|
|
|
|
.SH ERRORS
|
|
|
|
.TP
|
|
|
|
.B EBADF
|
2007-04-12 22:42:49 +00:00
|
|
|
One or both file descriptors are not valid,
|
2006-09-18 12:35:34 +00:00
|
|
|
or do not have proper read-write mode.
|
|
|
|
.TP
|
|
|
|
.B EINVAL
|
|
|
|
Target file system doesn't support splicing;
|
2007-04-12 22:42:49 +00:00
|
|
|
neither of the descriptors refers to a pipe; or
|
2006-09-18 12:35:34 +00:00
|
|
|
offset given for non-seekable device.
|
|
|
|
.TP
|
|
|
|
.B ENOMEM
|
|
|
|
Out of memory.
|
|
|
|
.TP
|
|
|
|
.B ESPIPE
|
2007-04-12 22:42:49 +00:00
|
|
|
Either
|
2006-09-18 12:35:34 +00:00
|
|
|
.I off_in
|
2007-04-12 22:42:49 +00:00
|
|
|
or
|
2006-09-18 12:35:34 +00:00
|
|
|
.I off_out
|
|
|
|
was not NULL, but the corresponding file descriptor refers to a pipe.
|
|
|
|
.SH HISTORY
|
|
|
|
The
|
|
|
|
.BR splice (2)
|
|
|
|
system call first appeared in Linux-2.6.17.
|
|
|
|
.SH NOTES
|
|
|
|
The three system calls
|
|
|
|
.BR splice (2),
|
|
|
|
.BR vmsplice (2),
|
|
|
|
and
|
|
|
|
.BR tee (2)),
|
2007-04-12 22:42:49 +00:00
|
|
|
provide userspace programs with full control over an arbitrary
|
2006-09-18 12:35:34 +00:00
|
|
|
kernel buffer, implemented within the kernel using the same type
|
2007-04-12 22:42:49 +00:00
|
|
|
of buffer that is used for a pipe.
|
2006-09-18 12:35:34 +00:00
|
|
|
In overview, these system calls perform the following tasks:
|
|
|
|
.TP 1.2i
|
|
|
|
.BR splice ()
|
|
|
|
moves data from the buffer to an arbitrary file descriptor, or vice versa,
|
|
|
|
or from one buffer to another.
|
|
|
|
.TP
|
2007-05-11 23:07:02 +00:00
|
|
|
.BR tee (2)
|
2006-09-18 12:35:34 +00:00
|
|
|
"copies" the data from one buffer to another.
|
|
|
|
.TP
|
2007-05-11 23:07:02 +00:00
|
|
|
.BR vmsplice (2)
|
2006-09-18 12:35:34 +00:00
|
|
|
"copies" data from user space into the buffer.
|
|
|
|
.PP
|
|
|
|
Though we talk of copying, actual copies are generally avoided.
|
2007-04-12 22:42:49 +00:00
|
|
|
The kernel does this by implementing a pipe buffer as a set
|
2006-09-18 12:35:34 +00:00
|
|
|
of reference-counted pointers to pages of kernel memory.
|
2007-04-12 22:42:49 +00:00
|
|
|
The kernel creates "copies" of pages in a buffer by creating new
|
|
|
|
pointers (for the output buffer) referring to the pages,
|
|
|
|
and increasing the reference counts for the pages:
|
2006-09-18 12:35:34 +00:00
|
|
|
only pointers are copied, not the pages of the buffer.
|
|
|
|
.\"
|
2007-04-12 22:42:49 +00:00
|
|
|
.\" Linus: Now, imagine using the above in a media server, for example.
|
|
|
|
.\" Let's say that a year or two has passed, so that the video drivers
|
|
|
|
.\" have been updated to be able to do the splice thing, and what can
|
2006-09-18 12:35:34 +00:00
|
|
|
.\" you do? You can:
|
2007-04-12 22:42:49 +00:00
|
|
|
.\"
|
2006-09-18 12:35:34 +00:00
|
|
|
.\" - splice from the (mpeg or whatever - let's just assume that the video
|
|
|
|
.\" input is either digital or does the encoding on its own - like they
|
|
|
|
.\" pretty much all do) video input into a pipe (remember: no copies - the
|
2007-04-12 22:42:49 +00:00
|
|
|
.\" video input will just DMA directly into memory, and splice will just
|
2006-09-18 12:35:34 +00:00
|
|
|
.\" set up the pages in the pipe buffer)
|
|
|
|
.\" - tee that pipe to split it up
|
|
|
|
.\" - splice one end to a file (ie "save the compressed stream to disk")
|
2007-04-12 22:42:49 +00:00
|
|
|
.\" - splice the other end to a real-time video decoder window for your
|
2006-09-18 12:35:34 +00:00
|
|
|
.\" real-time viewing pleasure.
|
|
|
|
.\"
|
2007-04-12 22:42:49 +00:00
|
|
|
.\" Linus: Now, the advantage of splice()/tee() is that you can
|
|
|
|
.\" do zero-copy movement of data, and unlike sendfile() you can
|
|
|
|
.\" do it on _arbitrary_ data (and, as shown by "tee()", it's more
|
|
|
|
.\" than just sending the data to somebody else: you can duplicate
|
|
|
|
.\" the data and choose to forward it to two or more different
|
2006-09-18 12:35:34 +00:00
|
|
|
.\" users - for things like logging etc).
|
|
|
|
.\"
|
|
|
|
.SH EXAMPLE
|
|
|
|
See
|
|
|
|
.BR tee (2).
|
|
|
|
.SH "CONFORMING TO"
|
|
|
|
This system call is Linux specific.
|
|
|
|
.SH SEE ALSO
|
|
|
|
.BR sendfile (2),
|
|
|
|
.BR splice (2),
|
2007-01-28 20:00:24 +00:00
|
|
|
.BR tee (2),
|
|
|
|
.BR feature_test_macros (7)
|