PIPE(2) System Calls PIPE(2)

pipe - create an interprocess channel

#include <unistd.h>
int pipe(int fildes[2]);
int pipe2(int fildes[2], int flags);

The pipe() and pipe2() functions create an I/O mechanism called a pipe and returns two file descriptors, fildes[0] and fildes[1]. The files associated with fildes[0] and fildes[1] are streams and are both opened for reading and writing. The pipe() call will clear the O_NDELAY, O_NONBLOCK, and FD_CLOEXEC flags on both file descriptors. The fcntl(2) function can be used to set these flags.

The pipe2() call will clear the O_NDELAY on both filedescriptors. The flags argument may be used to specify attributes on both file descriptors. pipe2() called with a flags value of 0 will behave identically to pipe(). Values for flags are constructed by a bitwise-inclusive-OR of flags from the following list, defined in <fcntl.h>.


Both file descriptors will be placed in non-blocking mode. This corresponds to the O_NONBLOCK flag to fcntl(2).


Both file descriptors will be opened with the FD_CLOEXEC flag set. Both file descriptors will be closed prior to any future exec() calls.

A read from fildes[0] accesses the data written to fildes[1] on a first-in-first-out (FIFO) basis and a read from fildes[1] accesses the data written to fildes[0] also on a FIFO basis.

Upon successful completion pipe() marks for update the st_atime, st_ctime, and st_mtime fields of the pipe.

Upon successful completion, 0 is returned. Otherwise, −1 is returned and errno is set to indicate the error.

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


More than {OPEN_MAX} file descriptors are already in use by this process.


The number of simultaneously open files in the system would exceed a system-imposed limit.


The fildes[2] argument points to an illegal address.

The pipe2() function will also fail if:


The flags argument is illegal. Valid flags are zero or a bitwise inclusive-OR of O_CLOEXEC and O_NONBLOCK.

See attributes(7) for descriptions of the following attributes:

Interface Stability Standard
MT-Level Async-Signal-Safe

sh(1), fcntl(2), fstat(2), getmsg(2), open(2), poll(2), putmsg(2), read(2), write(2), streamio(4I), attributes(7), standards(7)

Since a pipe is bi-directional, there are two separate flows of data. Therefore, the size (st_size) returned by a call to fstat(2) with argument fildes[0] or fildes[1] is the number of bytes available for reading from fildes[0] or fildes[1] respectively. Previously, the size (st_size) returned by a call to fstat() with argument fildes[1] (the write-end) was the number of bytes available for reading from fildes[0] (the read-end).

April 19, 2013 OmniOS