GNU/Linux |
CentOS 5.3 |
|
![]() |
pipe(2) |
![]() |
pipe − create pipe
#include <unistd.h>
int pipe(int filedes[2]);
pipe() creates a pair of file descriptors, pointing to a pipe inode, and places them in the array pointed to by filedes. filedes[0] is for reading, filedes[1] is for writing.
On success, zero is returned. On error, −1 is returned, and errno is set appropriately.
EFAULT |
filedes is not valid. | ||
EMFILE |
Too many file descriptors are in use by the process. | ||
ENFILE |
The system limit on the total number of open files has been reached. |
POSIX.1-2001.
The following program creates a pipe, and then fork(2)s to create a child process. After the fork(2), each process closes the descriptors that it doesn’t need for the pipe (see 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.
#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);
}
}
fork(2), read(2), socketpair(2), write(2), popen(3), pipe(7)
![]() |
pipe(2) | ![]() |