PIPE(2) System Calls Manual PIPE(2)

pipe, pipe2create descriptor pair for interprocess communication

#include <unistd.h>

int
pipe(int fildes[2]);

int
pipe2(int fildes[2], int flags);

The () function creates a pipe (an object that allows unidirectional data flow) and allocates a pair of file descriptors.

The first descriptor connects to the of the pipe; the second connects to the .

Data written to fildes[1] appears on (i.e., can be read from) fildes[0]. This allows the output of one program to be sent to another program: the source's standard output is set up to be the write end of the pipe; the sink's standard input is set up to be the read end of the pipe. The pipe itself persists until all of its associated descriptors are closed.

A pipe whose read or write end has been closed is considered . Writing on such a pipe causes the writing process to receive a SIGPIPE signal. Widowing a pipe is the only way to deliver end-of-file to a reader: after the reader consumes any buffered data, reading a widowed pipe returns a zero count.

The generation of the SIGPIPE signal can be suppressed using the F_SETNOSIGPIPE fcntl command.

The () function allows control over the initial attributes of the file descriptors via the flags argument. Value for flags are constructed by a bitwise-inclusive OR of flags from the following list, defined in <fcntl.h>:

Set the close-on-exec (FD_CLOEXEC) flag on both new descriptors.
Set the close-on-fork (FD_CLOFORK) flag on both new descriptors.
Set the non-blocking file status flag on both ends of the pipe.

If the flags argument is 0, the behavior is identical to a call to ().

On successful creation of the pipe, zero is returned. Otherwise, a value of -1 is returned and the variable errno set to indicate the error.

The pipe() and pipe2() calls will fail if:

[]
The fildes buffer is in an invalid area of the process's address space.
[]
Too many descriptors are active.
[]
The system file table is full.
[]
Not enough kernel memory to create a pipe.

The pipe2() call will fail if:

[]
The flags argument is invalid.

sh(1), fork(2), read(2), socketpair(2), fcntl(2), write(2)

A pipe() function call appeared in Version 6 AT&T UNIX.

February 17, 2011 BSD 4