A pipe is a unidirectional channel for communicating data between a parent and a child process. The parent creates the pipe, then forks the child. The child now has file descriptors for the pipe. The parent closes the output descriptor, but writes to the input descriptor. The child closes the input descriptor and reads from the output descriptor. Because the pipe is conveyed as open file handles, the pipe can exist only between a parent and some ancestor process.