2004-11-03 13:51:07 +00:00
|
|
|
.\" Hey Emacs! This file is -*- nroff -*- source.
|
|
|
|
.\"
|
|
|
|
.\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992
|
|
|
|
.\"
|
|
|
|
.\" 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.
|
|
|
|
.\"
|
|
|
|
.\" Modified by Michael Haardt <michael@moria.de>
|
|
|
|
.\" Modified 1993-07-23 by Rik Faith <faith@cs.unc.edu>
|
|
|
|
.\" Modified 1996-10-22 by Eric S. Raymond <esr@thyrsus.com>
|
2004-11-03 14:43:40 +00:00
|
|
|
.\" Modified 2004-06-17 by Michael Kerrisk <mtk-manpages@gmx.net>
|
2004-11-03 13:51:07 +00:00
|
|
|
.\"
|
|
|
|
.TH PIPE 2 2004-06-17 "Linux 2.6.7" "Linux Programmer's Manual"
|
|
|
|
.SH NAME
|
|
|
|
pipe \- create pipe
|
|
|
|
.SH SYNOPSIS
|
|
|
|
.B #include <unistd.h>
|
|
|
|
.sp
|
|
|
|
.BI "int pipe(int " filedes "[2]);"
|
|
|
|
.SH DESCRIPTION
|
2005-10-19 06:54:38 +00:00
|
|
|
.BR pipe ()
|
2004-11-03 13:51:07 +00:00
|
|
|
creates a pair of file descriptors, pointing to a pipe inode, and places
|
|
|
|
them in the array pointed to by
|
|
|
|
.IR filedes .
|
|
|
|
.I filedes[0]
|
|
|
|
is for reading,
|
|
|
|
.I filedes[1]
|
|
|
|
is for writing.
|
|
|
|
.SH "RETURN VALUE"
|
|
|
|
On success, zero is returned. On error, \-1 is returned, and
|
|
|
|
.I errno
|
|
|
|
is set appropriately.
|
|
|
|
.SH ERRORS
|
|
|
|
.TP
|
|
|
|
.B EFAULT
|
|
|
|
.I filedes
|
|
|
|
is not valid.
|
|
|
|
.TP
|
|
|
|
.B EMFILE
|
|
|
|
Too many file descriptors are in use by the process.
|
|
|
|
.TP
|
|
|
|
.B ENFILE
|
|
|
|
The system limit on the total number of open files has been reached.
|
|
|
|
.SH "CONFORMING TO"
|
2006-08-03 13:57:17 +00:00
|
|
|
POSIX.1-2001.
|
2005-12-09 14:24:10 +00:00
|
|
|
.SH EXAMPLE
|
2005-12-12 09:19:46 +00:00
|
|
|
.\" fork.2 refers to this example program.
|
2005-12-09 14:24:10 +00:00
|
|
|
The following program creates a pipe, and then
|
|
|
|
.BR fork (2)s
|
|
|
|
to create a child process.
|
|
|
|
After the
|
|
|
|
.BR fork (2),
|
|
|
|
each process closes the descriptors that it doesn't need for the pipe
|
|
|
|
(see
|
|
|
|
.BR pipe (7)).
|
|
|
|
The parent then writes the string contained in the program's
|
|
|
|
command-line argument to the pipe,
|
|
|
|
and the child reads this string a byte at a time from the pipe
|
|
|
|
and echoes it on standard output.
|
|
|
|
.nf
|
|
|
|
|
|
|
|
#include <sys/wait.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
int
|
|
|
|
main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
int pfd[2];
|
|
|
|
pid_t cpid;
|
|
|
|
char buf;
|
|
|
|
|
|
|
|
assert(argc == 2);
|
|
|
|
|
|
|
|
if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }
|
|
|
|
|
|
|
|
cpid = fork();
|
|
|
|
if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }
|
|
|
|
|
|
|
|
if (cpid == 0) { /* Child reads from pipe */
|
|
|
|
close(pfd[1]); /* Close unused write end */
|
|
|
|
|
|
|
|
while (read(pfd[0], &buf, 1) > 0)
|
|
|
|
write(STDOUT_FILENO, &buf, 1);
|
|
|
|
|
|
|
|
write(STDOUT_FILENO, "\\n", 1);
|
|
|
|
close(pfd[0]);
|
|
|
|
_exit(EXIT_SUCCESS);
|
|
|
|
|
|
|
|
} else { /* Parent writes argv[1] to pipe */
|
|
|
|
close(pfd[0]); /* Close unused read end */
|
|
|
|
write(pfd[1], argv[1], strlen(argv[1]));
|
|
|
|
close(pfd[1]); /* Reader will see EOF */
|
|
|
|
wait(NULL); /* Wait for child */
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.fi
|
2004-11-03 13:51:07 +00:00
|
|
|
.SH "SEE ALSO"
|
|
|
|
.BR fork (2),
|
|
|
|
.BR read (2),
|
|
|
|
.BR socketpair (2),
|
2005-12-08 18:57:25 +00:00
|
|
|
.BR write (2),
|
2006-05-29 05:12:37 +00:00
|
|
|
.BR popen (3),
|
2005-12-08 18:57:25 +00:00
|
|
|
.BR pipe (7)
|