One solution to some of the buffering problems of asynchronous send is to provide an intermediate degree of synchrony between pure synchronous and asynchronous. That is exactly the kind of message passing supported by Unix pipes.
Pipes also allow the output of one process to become the input of another.
A pipe is like a file opened for reading and writing. Pipes are constructed by the service call pipe , which opens a new pipe and returns two descriptors for it, one for reading and another for writing. Reading a pipe advances the read buffer, and writing it advances the write buffer. The operating system may only wish to buffer a limited amount of data for each pipe, so an attempt to write to a full pipe may block the writer. Likewise, an attempt to read from an empty buffer will block the reader.