| .TH PIPE 3 |
| .SH NAME |
| pipe \- create an interprocess channel |
| .SH SYNOPSIS |
| .B #include <u.h> |
| .br |
| .B #include <libc.h> |
| .PP |
| .B |
| int pipe(int fd[2]) |
| .SH DESCRIPTION |
| .I Pipe |
| creates a buffered channel for interprocess I/O communication. |
| Two file descriptors are returned in |
| .IR fd . |
| Data written to |
| .B fd[1] |
| is available for reading from |
| .B fd[0] |
| and data written to |
| .B fd[0] |
| is available for reading from |
| .BR fd[1] . |
| .PP |
| After the pipe has been established, |
| cooperating processes |
| created by subsequent |
| .IR fork (2) |
| calls may pass data through the |
| pipe with |
| .I read |
| and |
| .I write |
| calls. |
| .\" The bytes placed on a pipe |
| .\" by one |
| .\" .I write |
| .\" are contiguous even if many processes are writing. |
| .\" Write boundaries are preserved: each read terminates |
| .\" when the read buffer is full or after reading the last byte |
| .\" of a write, whichever comes first. |
| .\" .PP |
| .\" The number of bytes available to a |
| .\" .IR read (3) |
| .\" is reported |
| .\" in the |
| .\" .B Length |
| .\" field returned by |
| .\" .I fstat |
| .\" or |
| .\" .I dirfstat |
| .\" on a pipe (see |
| .\" .IR stat (3)). |
| .PP |
| When all the data has been read from a pipe and the writer has closed the pipe or exited, |
| .IR read (3) |
| will return 0 bytes. Writes to a pipe with no reader will generate a note |
| .BR "sys: write on closed pipe" . |
| .SH SOURCE |
| .B \*9/src/lib9/pipe.c |
| .SH SEE ALSO |
| .IR intro (3), |
| .IR read (3) |
| .SH DIAGNOSTICS |
| Sets |
| .IR errstr . |
| .SH BUGS |
| If a read or a write of a pipe is interrupted, some unknown |
| number of bytes may have been transferred. |
| .PP |
| .I Pipe |
| is a macro defined as |
| .I p9pipe |
| to avoid name conflicts with Unix's |
| .I pipe |
| system call. |
| .PP |
| Unix pipes are not guaranteed to be bidirectional. |
| In order to ensure a bidirectional channel, |
| .I p9pipe |
| creates Unix domain sockets via the |
| .IR socketpair (2) |
| instead of Unix pipes. |
| .PP |
| The implementation of pipes as Unix domain sockets |
| causes problems with some Unix implementations of |
| .BR /dev/fd , |
| Unix's dup device. If a Unix domain socket is open as file |
| descriptor 0, some implementations disallow the opening of |
| .BR /dev/fd/0 ; |
| instead one must |
| .IR connect (2) |
| to it. |
| If this functionality is important |
| (as it is for |
| .IR rc (1)), |
| one must |
| .B #undef |
| .B pipe |
| and fall back on the (possibly unidirectional) Unix pipes. |