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 the FD_CLOEXEC and FD_CLOFORK 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>.
O_NONBLOCK
Both file descriptors will be placed in non-blocking
mode. This corresponds to the O_NONBLOCK flag to
fcntl(2).
O_CLOEXEC
Both file descriptors will be opened with the FD_CLOEXEC
flag set. Both file descriptors will be closed prior to
any future exec() calls.
O_CLOFORK
Both file descriptors will be opened with the FD_CLOFORK
flag set. Both file descriptors will be closed in any
child processes created with the fork() family of 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:
EMFILE
More than {OPEN_MAX} file descriptors are already in use by
this process.
ENFILE
The number of simultaneously open files in the system would
exceed a system-imposed limit.
EFAULT
The fildes[2] argument points to an illegal address.
The pipe2() function will also fail if:
EINVAL
The flags argument is illegal. Valid flags are zero or a
bitwise inclusive-OR of O_CLOEXEC, O_CLOFORK, and
O_NONBLOCK.
See attributes(7) for descriptions of the following attributes:
+--------------------+-------------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-------------------+
|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).
June 21, 2024 PIPE(2)
NAME
pipe - create an interprocess channel
SYNOPSIS
#include <unistd.h>
int pipe(int fildes[2]);
int pipe2(int fildes[2], int flags);
DESCRIPTION
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 the FD_CLOEXEC and FD_CLOFORK 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>.
O_NONBLOCK
Both file descriptors will be placed in non-blocking
mode. This corresponds to the O_NONBLOCK flag to
fcntl(2).
O_CLOEXEC
Both file descriptors will be opened with the FD_CLOEXEC
flag set. Both file descriptors will be closed prior to
any future exec() calls.
O_CLOFORK
Both file descriptors will be opened with the FD_CLOFORK
flag set. Both file descriptors will be closed in any
child processes created with the fork() family of 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.
RETURN VALUES
Upon successful completion, 0 is returned. Otherwise, -1 is returned
and errno is set to indicate the error.
ERRORS
The pipe() and pipe2() functions will fail if:
EMFILE
More than {OPEN_MAX} file descriptors are already in use by
this process.
ENFILE
The number of simultaneously open files in the system would
exceed a system-imposed limit.
EFAULT
The fildes[2] argument points to an illegal address.
The pipe2() function will also fail if:
EINVAL
The flags argument is illegal. Valid flags are zero or a
bitwise inclusive-OR of O_CLOEXEC, O_CLOFORK, and
O_NONBLOCK.
ATTRIBUTES
See attributes(7) for descriptions of the following attributes:
+--------------------+-------------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-------------------+
|Interface Stability | Standard |
+--------------------+-------------------+
|MT-Level | Async-Signal-Safe |
+--------------------+-------------------+
SEE ALSO
sh(1), fcntl(2), fstat(2), getmsg(2), open(2), poll(2), putmsg(2),
read(2), write(2), streamio(4I), attributes(7), standards(7)
NOTES
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).
June 21, 2024 PIPE(2)