| .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 (3) |
| 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 /sys/src/libc/9syscall |
| .SH SEE ALSO |
| .IR intro (3), |
| .IR read (3), |
| .IR pipe (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. |
| .br |
| When a read from a pipe returns 0 bytes, it usually means end of file |
| but is indistinguishable from reading the result of an explicit |
| write of zero bytes. |