mirror of https://github.com/mkerrisk/man-pages
New system calls in 2.6.17.
This commit is contained in:
parent
8231ec7de4
commit
2bc4bb77a9
|
@ -0,0 +1,218 @@
|
|||
.\" 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.
|
||||
.\"
|
||||
.\" 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.
|
||||
.\"
|
||||
.\" 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>
|
||||
|
||||
.BI "long splice(int " fd_in ", off_t *" off_in ", int " fd_out ,
|
||||
.BI " off_t *" off_out ", size_t " len \
|
||||
", unsigned int " flags );
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
.BR splice ()
|
||||
moves data between two file descriptors
|
||||
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 ,
|
||||
where one of the descriptors must refer to a pipe.
|
||||
|
||||
If
|
||||
.I in_fd
|
||||
refers to a pipe, then
|
||||
.I in_off
|
||||
must be NULL.
|
||||
If
|
||||
.I in_fd
|
||||
does not refer to a pipe and
|
||||
.I in_off
|
||||
is NULL, then bytes are read from
|
||||
.I in_fd
|
||||
starting from the current file offset,
|
||||
and the current file offset is adjusted appropriately.
|
||||
If
|
||||
.I in_fd
|
||||
does not refer to a pipe and
|
||||
.I in_off
|
||||
is not NULL, then
|
||||
.I in_off
|
||||
must point to a buffer which specifies the starting
|
||||
offset from which bytes will be read from
|
||||
.IR in_fd ;
|
||||
in this case, the current file offset of
|
||||
.IR in_fd
|
||||
is not changed.
|
||||
Analogous statements apply for
|
||||
.I out_fd
|
||||
and
|
||||
.IR out_off .
|
||||
|
||||
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
|
||||
Attempt to move pages instead of copying.
|
||||
This is only a hint to the kernel:
|
||||
pages may still be copied if the kernel cannot move the
|
||||
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.
|
||||
This makes the splice pipe operations non-blocking, but
|
||||
.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
|
||||
the
|
||||
.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
|
||||
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
|
||||
.IR fd_in .
|
||||
|
||||
On error,
|
||||
.BR splice ()
|
||||
returns \-1 and
|
||||
.I errno
|
||||
is set to indicate the error.
|
||||
.SH ERRORS
|
||||
.TP
|
||||
.B EBADF
|
||||
One or both file descriptors are not valid,
|
||||
or do not have proper read-write mode.
|
||||
.TP
|
||||
.B EINVAL
|
||||
Target file system doesn't support splicing;
|
||||
neither of the descriptors refers to a pipe; or
|
||||
offset given for non-seekable device.
|
||||
.TP
|
||||
.B ENOMEM
|
||||
Out of memory.
|
||||
.TP
|
||||
.B ESPIPE
|
||||
Either
|
||||
.I off_in
|
||||
or
|
||||
.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)),
|
||||
provide userspace programs with full control over an arbitrary
|
||||
kernel buffer, implemented within the kernel using the same type
|
||||
of buffer that is used for a pipe.
|
||||
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
|
||||
.BR tee ()
|
||||
"copies" the data from one buffer to another.
|
||||
.TP
|
||||
.BR vmsplice ()
|
||||
"copies" data from user space into the buffer.
|
||||
.PP
|
||||
Though we talk of copying, actual copies are generally avoided.
|
||||
The kernel does this by implementing a pipe buffer as a set
|
||||
of reference-counted pointers to pages of kernel memory.
|
||||
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:
|
||||
only pointers are copied, not the pages of the buffer.
|
||||
.\"
|
||||
.\" 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
|
||||
.\" you do? You can:
|
||||
.\"
|
||||
.\" - 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
|
||||
.\" video input will just DMA directly into memory, and splice will just
|
||||
.\" 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")
|
||||
.\" - splice the other end to a real-time video decoder window for your
|
||||
.\" real-time viewing pleasure.
|
||||
.\"
|
||||
.\" 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
|
||||
.\" 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),
|
||||
.BR tee (2)
|
|
@ -0,0 +1,195 @@
|
|||
.\" 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.
|
||||
.\"
|
||||
.\" 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.
|
||||
.\"
|
||||
.\" Formatted or processed versions of this manual, if unaccompanied by
|
||||
.\" the source, must acknowledge the copyright and authors of this work.
|
||||
.\"
|
||||
.TH tee 2 2006-04-28 "Linux 2.6.17" "Linux Programmer's Manual"
|
||||
.SH NAME
|
||||
tee \- duplicating pipe content
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #define _GNU_SOURCE
|
||||
.B #include <fcntl.h>
|
||||
|
||||
.BI "long tee(int " fd_in ", int " fd_out ", size_t " len \
|
||||
", unsigned int " flags );
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
.\" Example programs http://brick.kernel.dk/snaps
|
||||
.\"
|
||||
.\"
|
||||
.\" add a "tee(in, out1, out2)" system call that duplicates the pages
|
||||
.\" (again, incrementing their reference count, not copying the data) from
|
||||
.\" one pipe to two other pipes.
|
||||
.BR tee ()
|
||||
duplicates up to
|
||||
.I len
|
||||
bytes of data from the pipe referred to by the file descriptor
|
||||
.I fd_in
|
||||
to the pipe referred to by the file descriptor
|
||||
.IR fd_out .
|
||||
It does not consume the data that is duplicated from
|
||||
.IR fd_in ;
|
||||
therefore, that data can be copied by a subsequent
|
||||
.BR splice (2).
|
||||
|
||||
.I flags
|
||||
is a series of modifier flags, which share the name space with
|
||||
.BR splice (2)
|
||||
and
|
||||
.BR vmsplice (2):
|
||||
.TP 1.9i
|
||||
.B SPLICE_F_MOVE
|
||||
Currently has no effect for
|
||||
.BR tee ();
|
||||
see
|
||||
.BR splice (2).
|
||||
.TP
|
||||
.B SPLICE_F_NONBLOCK
|
||||
Do not block on I/O; see
|
||||
.BR splice (2)
|
||||
for further details.
|
||||
.TP
|
||||
.B SPLICE_F_MORE
|
||||
Currently has no effect for
|
||||
.BR tee (),
|
||||
but may be implemented in the future; see
|
||||
.BR splice (2).
|
||||
.TP
|
||||
.B SPLICE_F_GIFT
|
||||
Unused for
|
||||
.BR tee ();
|
||||
see
|
||||
.BR vmsplice (2).
|
||||
.SH RETURN VALUE
|
||||
Upon successful completion,
|
||||
.BR tee ()
|
||||
returns the number of bytes that were duplicated between the input
|
||||
and output.
|
||||
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
|
||||
.IR fd_in .
|
||||
|
||||
On error,
|
||||
.BR tee ()
|
||||
returns \-1 and
|
||||
.I errno
|
||||
is set to indicate the error.
|
||||
.SH ERRORS
|
||||
.TP
|
||||
.B EINVAL
|
||||
.I fd_in
|
||||
or
|
||||
.I fd_out
|
||||
does not refer to a pipe; or
|
||||
.I fd_in
|
||||
and
|
||||
.I fd_out
|
||||
refer to the same pipe.
|
||||
.TP
|
||||
.B ENOMEM
|
||||
Out of memory.
|
||||
.SH NOTES
|
||||
Conceptually,
|
||||
.BR tee ()
|
||||
copies the data between the two pipes.
|
||||
In reality no real data copying takes place though:
|
||||
under the covers,
|
||||
.BR tee ()
|
||||
assigns data in the output by merely grabbing
|
||||
a reference to the input.
|
||||
.SH EXAMPLE
|
||||
The following example implements a basic
|
||||
.BR tee (1)
|
||||
program using the
|
||||
.BR tee (2)
|
||||
system call.
|
||||
.nf
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int fd;
|
||||
int len, slen;
|
||||
|
||||
assert(argc == 2);
|
||||
|
||||
fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
|
||||
if (fd == -1) {
|
||||
perror("open");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
do {
|
||||
/*
|
||||
* tee stdin to stdout.
|
||||
*/
|
||||
len = tee(STDIN_FILENO, STDOUT_FILENO,
|
||||
INT_MAX, SPLICE_F_NONBLOCK);
|
||||
|
||||
if (len < 0) {
|
||||
if (errno == EAGAIN)
|
||||
continue;
|
||||
perror("tee");
|
||||
exit(EXIT_FAILURE);
|
||||
} else
|
||||
if (len == 0)
|
||||
break;
|
||||
|
||||
/*
|
||||
* Consume stdin by splicing it to a file.
|
||||
*/
|
||||
while (len > 0) {
|
||||
slen = splice(STDIN_FILENO, NULL, fd, NULL,
|
||||
len, SPLICE_F_MOVE);
|
||||
if (slen < 0) {
|
||||
perror("splice");
|
||||
break;
|
||||
}
|
||||
len -= slen;
|
||||
}
|
||||
} while (1);
|
||||
|
||||
close(fd);
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
.fi
|
||||
.SH HISTORY
|
||||
The
|
||||
.BR tee (2)
|
||||
system call first appeared in Linux-2.6.17.
|
||||
.SH "CONFORMING TO"
|
||||
This system call is Linux specific.
|
||||
.SH SEE ALSO
|
||||
.BR splice (2),
|
||||
.BR vmsplice (2)
|
|
@ -0,0 +1,154 @@
|
|||
.\" 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.
|
||||
.\"
|
||||
.\" 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.
|
||||
.\"
|
||||
.\" Formatted or processed versions of this manual, if unaccompanied by
|
||||
.\" the source, must acknowledge the copyright and authors of this work.
|
||||
.\"
|
||||
.TH vmsplice 2 2006-04-28 "Linux 2.6.17" "Linux Programmer's Manual"
|
||||
.SH NAME
|
||||
vmsplice \- splice user pages into a pipe
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #define _GNU_SOURCE
|
||||
.B #include <fcntl.h>
|
||||
.B #include <sys/uio.h>
|
||||
|
||||
.BI "long vmsplice(int " fd ", const struct iovec *" iov ,
|
||||
.BI " unsigned long " nr_segs ", unsigned int " flags );
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
.\" Linus: vmsplice() system call to basically do a "write to
|
||||
.\" the buffer", but using the reference counting and VM traversal
|
||||
.\" to actually fill the buffer. This means that the user needs to
|
||||
.\" be careful not to re-use the user-space buffer it spliced into
|
||||
.\" the kernel-space one (contrast this to "write()", which copies
|
||||
.\" the actual data, and you can thus re-use the buffer immediately
|
||||
.\" after a successful write), but that is often easy to do.
|
||||
The
|
||||
.BR vmsplice ()
|
||||
system call maps
|
||||
.I nr_segs
|
||||
ranges of user memory described by
|
||||
.I iov
|
||||
into a pipe.
|
||||
The file descriptor
|
||||
.I fd
|
||||
must refer to a pipe.
|
||||
|
||||
The pointer
|
||||
.I iov
|
||||
points to an array of
|
||||
.I iovec
|
||||
structures as defined in
|
||||
.IR <sys/uio.h> :
|
||||
|
||||
.in +0.25i
|
||||
.nf
|
||||
struct iovec {
|
||||
void *iov_base; /* Starting address */
|
||||
size_t iov_len; /* Number of bytes */
|
||||
};
|
||||
.in -0.25i
|
||||
.fi
|
||||
|
||||
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
|
||||
Unused for
|
||||
.BR vmsplice ();
|
||||
see
|
||||
.BR splice (2).
|
||||
.TP
|
||||
.B SPLICE_F_NONBLOCK
|
||||
.\" Not used for vmsplice
|
||||
.\" May be in the future -- therefore EAGAIN
|
||||
Do not block on I/O; see
|
||||
.BR splice (2)
|
||||
for further details.
|
||||
.TP
|
||||
.B SPLICE_F_MORE
|
||||
Currently has no effect for
|
||||
.BR vmsplice (),
|
||||
but may be implemented in the future; see
|
||||
.BR splice (2).
|
||||
.TP
|
||||
.B SPLICE_F_GIFT
|
||||
The user pages are a gift to the kernel.
|
||||
The application may not modify this memory ever,
|
||||
.\" FIXME Explain the following line in a little more detail:
|
||||
or page cache and on-disk data may differ.
|
||||
Gifting pages to the kernel means that a subsequent
|
||||
.BR splice ()
|
||||
.B SPLICE_F_MOVE
|
||||
can successfully move the pages;
|
||||
if this flag is not specified, then a subsequent
|
||||
.BR splice ()
|
||||
.B SPLICE_F_MOVE
|
||||
must copy the pages.
|
||||
Data must also be properly page aligned, both in memory and length.
|
||||
.\" .... if we expect to later SPLICE_F_MOVE to the cache.
|
||||
.SH RETURN VALUE
|
||||
Upon successful completion,
|
||||
.BR vmsplice ()
|
||||
returns the number of bytes transferred to the pipe.
|
||||
On error,
|
||||
.BR vmplice ()
|
||||
returns \-1 and
|
||||
.I errno
|
||||
is set to indicate the error.
|
||||
.SH ERRORS
|
||||
.TP
|
||||
.B EBADF
|
||||
.I fd
|
||||
either not valid, or doesn't refer to a pipe.
|
||||
.TP
|
||||
.B EINVAL
|
||||
.I nr_segs
|
||||
is 0 or greater than
|
||||
.BR IOV_MAX;
|
||||
or memory not aligned if
|
||||
.B SPLICE_F_GIFT
|
||||
set.
|
||||
.TP
|
||||
.B ENOMEM
|
||||
Out of memory.
|
||||
.SH NOTES
|
||||
.BR vmsplice ()
|
||||
follows the other vectorized read/write type functions when it comes to
|
||||
limitations on number of segments being passed in.
|
||||
This limit is
|
||||
.B IOV_MAX
|
||||
as defined in
|
||||
.IR <limits.h> .
|
||||
At the time of this writing, that limit is 1024.
|
||||
.SH HISTORY
|
||||
The
|
||||
.BR vmsplice (2)
|
||||
system call first appeared in Linux-2.6.17.
|
||||
.SH "CONFORMING TO"
|
||||
This system call is Linux specific.
|
||||
.SH SEE ALSO
|
||||
.BR splice (2),
|
||||
.BR tee (2)
|
Loading…
Reference in New Issue