| @node Pipes and FIFOs, Sockets, File System Interface, Top |
| @c %MENU% A simple interprocess communication mechanism |
| @chapter Pipes and FIFOs |
| |
| @cindex pipe |
| A @dfn{pipe} is a mechanism for interprocess communication; data written |
| to the pipe by one process can be read by another process. The data is |
| handled in a first-in, first-out (FIFO) order. The pipe has no name; it |
| is created for one use and both ends must be inherited from the single |
| process which created the pipe. |
| |
| @cindex FIFO special file |
| A @dfn{FIFO special file} is similar to a pipe, but instead of being an |
| anonymous, temporary connection, a FIFO has a name or names like any |
| other file. Processes open the FIFO by name in order to communicate |
| through it. |
| |
| A pipe or FIFO has to be open at both ends simultaneously. If you read |
| from a pipe or FIFO file that doesn't have any processes writing to it |
| (perhaps because they have all closed the file, or exited), the read |
| returns end-of-file. Writing to a pipe or FIFO that doesn't have a |
| reading process is treated as an error condition; it generates a |
| @code{SIGPIPE} signal, and fails with error code @code{EPIPE} if the |
| signal is handled or blocked. |
| |
| Neither pipes nor FIFO special files allow file positioning. Both |
| reading and writing operations happen sequentially; reading from the |
| beginning of the file and writing at the end. |
| |
| @menu |
| * Creating a Pipe:: Making a pipe with the @code{pipe} function. |
| * Pipe to a Subprocess:: Using a pipe to communicate with a |
| child process. |
| * FIFO Special Files:: Making a FIFO special file. |
| * Pipe Atomicity:: When pipe (or FIFO) I/O is atomic. |
| @end menu |
| |
| @node Creating a Pipe |
| @section Creating a Pipe |
| @cindex creating a pipe |
| @cindex opening a pipe |
| @cindex interprocess communication, with pipes |
| |
| The primitive for creating a pipe is the @code{pipe} function. This |
| creates both the reading and writing ends of the pipe. It is not very |
| useful for a single process to use a pipe to talk to itself. In typical |
| use, a process creates a pipe just before it forks one or more child |
| processes (@pxref{Creating a Process}). The pipe is then used for |
| communication either between the parent or child processes, or between |
| two sibling processes. |
| |
| The @code{pipe} function is declared in the header file |
| @file{unistd.h}. |
| @pindex unistd.h |
| |
| @comment unistd.h |
| @comment POSIX.1 |
| @deftypefun int pipe (int @var{filedes}@t{[2]}) |
| The @code{pipe} function creates a pipe and puts the file descriptors |
| for the reading and writing ends of the pipe (respectively) into |
| @code{@var{filedes}[0]} and @code{@var{filedes}[1]}. |
| |
| An easy way to remember that the input end comes first is that file |
| descriptor @code{0} is standard input, and file descriptor @code{1} is |
| standard output. |
| |
| If successful, @code{pipe} returns a value of @code{0}. On failure, |
| @code{-1} is returned. The following @code{errno} error conditions are |
| defined for this function: |
| |
| @table @code |
| @item EMFILE |
| The process has too many files open. |
| |
| @item ENFILE |
| There are too many open files in the entire system. @xref{Error Codes}, |
| for more information about @code{ENFILE}. This error never occurs in |
| the GNU system. |
| @end table |
| @end deftypefun |
| |
| Here is an example of a simple program that creates a pipe. This program |
| uses the @code{fork} function (@pxref{Creating a Process}) to create |
| a child process. The parent process writes data to the pipe, which is |
| read by the child process. |
| |
| @smallexample |
| @include pipe.c.texi |
| @end smallexample |
| |
| @node Pipe to a Subprocess |
| @section Pipe to a Subprocess |
| @cindex creating a pipe to a subprocess |
| @cindex pipe to a subprocess |
| @cindex filtering i/o through subprocess |
| |
| A common use of pipes is to send data to or receive data from a program |
| being run as a subprocess. One way of doing this is by using a combination of |
| @code{pipe} (to create the pipe), @code{fork} (to create the subprocess), |
| @code{dup2} (to force the subprocess to use the pipe as its standard input |
| or output channel), and @code{exec} (to execute the new program). Or, |
| you can use @code{popen} and @code{pclose}. |
| |
| The advantage of using @code{popen} and @code{pclose} is that the |
| interface is much simpler and easier to use. But it doesn't offer as |
| much flexibility as using the low-level functions directly. |
| |
| @comment stdio.h |
| @comment POSIX.2, SVID, BSD |
| @deftypefun {FILE *} popen (const char *@var{command}, const char *@var{mode}) |
| The @code{popen} function is closely related to the @code{system} |
| function; see @ref{Running a Command}. It executes the shell command |
| @var{command} as a subprocess. However, instead of waiting for the |
| command to complete, it creates a pipe to the subprocess and returns a |
| stream that corresponds to that pipe. |
| |
| If you specify a @var{mode} argument of @code{"r"}, you can read from the |
| stream to retrieve data from the standard output channel of the subprocess. |
| The subprocess inherits its standard input channel from the parent process. |
| |
| Similarly, if you specify a @var{mode} argument of @code{"w"}, you can |
| write to the stream to send data to the standard input channel of the |
| subprocess. The subprocess inherits its standard output channel from |
| the parent process. |
| |
| In the event of an error @code{popen} returns a null pointer. This |
| might happen if the pipe or stream cannot be created, if the subprocess |
| cannot be forked, or if the program cannot be executed. |
| @end deftypefun |
| |
| @comment stdio.h |
| @comment POSIX.2, SVID, BSD |
| @deftypefun int pclose (FILE *@var{stream}) |
| The @code{pclose} function is used to close a stream created by @code{popen}. |
| It waits for the child process to terminate and returns its status value, |
| as for the @code{system} function. |
| @end deftypefun |
| |
| Here is an example showing how to use @code{popen} and @code{pclose} to |
| filter output through another program, in this case the paging program |
| @code{more}. |
| |
| @smallexample |
| @include popen.c.texi |
| @end smallexample |
| |
| @node FIFO Special Files |
| @section FIFO Special Files |
| @cindex creating a FIFO special file |
| @cindex interprocess communication, with FIFO |
| |
| A FIFO special file is similar to a pipe, except that it is created in a |
| different way. Instead of being an anonymous communications channel, a |
| FIFO special file is entered into the file system by calling |
| @code{mkfifo}. |
| |
| Once you have created a FIFO special file in this way, any process can |
| open it for reading or writing, in the same way as an ordinary file. |
| However, it has to be open at both ends simultaneously before you can |
| proceed to do any input or output operations on it. Opening a FIFO for |
| reading normally blocks until some other process opens the same FIFO for |
| writing, and vice versa. |
| |
| The @code{mkfifo} function is declared in the header file |
| @file{sys/stat.h}. |
| @pindex sys/stat.h |
| |
| @comment sys/stat.h |
| @comment POSIX.1 |
| @deftypefun int mkfifo (const char *@var{filename}, mode_t @var{mode}) |
| The @code{mkfifo} function makes a FIFO special file with name |
| @var{filename}. The @var{mode} argument is used to set the file's |
| permissions; see @ref{Setting Permissions}. |
| |
| The normal, successful return value from @code{mkfifo} is @code{0}. In |
| the case of an error, @code{-1} is returned. In addition to the usual |
| file name errors (@pxref{File Name Errors}), the following |
| @code{errno} error conditions are defined for this function: |
| |
| @table @code |
| @item EEXIST |
| The named file already exists. |
| |
| @item ENOSPC |
| The directory or file system cannot be extended. |
| |
| @item EROFS |
| The directory that would contain the file resides on a read-only file |
| system. |
| @end table |
| @end deftypefun |
| |
| @node Pipe Atomicity |
| @section Atomicity of Pipe I/O |
| |
| Reading or writing pipe data is @dfn{atomic} if the size of data written |
| is not greater than @code{PIPE_BUF}. This means that the data transfer |
| seems to be an instantaneous unit, in that nothing else in the system |
| can observe a state in which it is partially complete. Atomic I/O may |
| not begin right away (it may need to wait for buffer space or for data), |
| but once it does begin it finishes immediately. |
| |
| Reading or writing a larger amount of data may not be atomic; for |
| example, output data from other processes sharing the descriptor may be |
| interspersed. Also, once @code{PIPE_BUF} characters have been written, |
| further writes will block until some characters are read. |
| |
| @xref{Limits for Files}, for information about the @code{PIPE_BUF} |
| parameter. |