.ds FN /sys/man/2/pipe .so src2 \&.TH PIPE 2 \&.SH NAME pipe \- create an interprocess channel \&.SH SYNOPSIS \&.B #include \&.br \&.B #include \&.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 (2) is reported in the \&.B Length field returned by \&.I fstat or \&.I dirfstat on a pipe (see \&.IR stat (2)). \&.PP When all the data has been read from a pipe and the writer has closed the pipe or exited, \&.IR read (2) 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 (2), \&.IR read (2), \&.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.