pipe
NAME
pipe - overview of pipes and FIFOs
DESCRIPTION
Pipes and FIFOs (also known as named pipes)
provide a unidirectional interprocess communication channel.
A pipe has a
read end
and a
R write end .
Data written to the write end of a pipe can be read
from the read end of the pipe.
A pipe is created using
pipe(2),
which creates a new pipe and returns two file descriptors,
one referring to the read end of the pipe,
the other referring to the write end.
Pipes can be used to create a communication channel between related
processes; see
pipe(2)
for an example.
A FIFO (short for First In First Out) has a name within the file
system (created using
mkfifo(3)),
and is opened using
open(2).
Any process may open a FIFO, assuming the file permissions allow it.
The read end is opened using the
O_RDONLY
flag; the write end is opened using the
O_WRONLY
flag.
See
fifo(7)
for further details.
R Note :
although FIFOs have a pathname in the file system,
I/O on FIFOs does not involve operations on the underlying device
(if there is one).
I/O on Pipes and FIFOs
The only difference between pipes and FIFOs is the manner in which they are created and opened. Once these tasks have been accomplished, I/O on pipes and FIFOs has exactly the same semantics. If a process attempts to read from an empty pipe, then read(2) will block until data is available. If a process attempts to write to a full pipe (see below), then write(2) blocks until sufficient data has been read from the pipe to allow the write to complete. Non-blocking I/O is possible by using the fcntl(2) F_SETFL operation to enable the O_NONBLOCK open file status flag. The communication channel provided by a pipe is a R byte stream : there is no concept of message boundaries. If all file descriptors referring to the write end of a pipe have been closed, then an attempt to read(2) from the pipe will see end-of-file (read(2) will return 0). If all file descriptors referring to the read end of a pipe have been closed, then a write(2) will cause a SIGPIPE signal to be generated for the calling process. If the calling process is ignoring this signal, then write(2) fails with the error R EPIPE . An application that uses pipe(2) and fork(2) should use suitable close(2) calls to close unnecessary duplicate file descriptors; this ensures that end-of-file and R SIGPIPE / EPIPE are delivered when appropriate. It is not possible to apply lseek(2) to a pipe.Pipe Capacity
A pipe has a limited capacity. If the pipe is full, then a write(2) will block or fail, depending on whether the O_NONBLOCK flag is set (see below). Different implementations have different limits for the pipe capacity. Applications should not rely on a particular capacity: an application should be designed so that a reading process consumes data as soon as it is available, so that a writing process does not remain blocked. In Linux versions before 2.6.11, the capacity of a pipe was the same as the system page size (e.g., 4096 bytes on x86). Since Linux 2.6.11, the pipe capacity is 65536 bytes.PIPE_BUF
POSIX.1-2001 says that write(2)s of less than PIPE_BUF bytes must be atomic: the output data is written to the pipe as a contiguous sequence. Writes of more than PIPE_BUF bytes may be non-atomic: the kernel may interleave the data with data written by other processes. POSIX.1-2001 requires PIPE_BUF to be at least 512 bytes. (On Linux, PIPE_BUF is 4096 bytes.) The precise semantics depend on whether the file descriptor is non-blocking (O_NONBLOCK), whether there are multiple writers to the pipe, and on R n , the number of bytes to be written:O_NONBLOCK disabled, n <= PIPE_BUF
All
n
bytes are written atomically;
write(2)
may block if there is not room for
n
bytes to be written immediately
O_NONBLOCK enabled, n <= PIPE_BUF
O_NONBLOCK disabled, n > PIPE_BUF
O_NONBLOCK enabled, n > PIPE_BUF
If the pipe is full, then
write(2)
fails, with
errno
set to
R EAGAIN .
Otherwise, from 1 to
n
bytes may be written (i.e., a "partial write" may occur;
the caller should check the return value from
write(2)
to see how many bytes were actually written),
and these bytes may be interleaved with writes by other processes.
