UNIX System V has an interesting mechanism, called STREAMS, that enables an application to assemble pipelines of driver code dynamically.
A stream is a full-duplex connection between a device driver and a user-level process.
It consists of a stream head that interfaces with the user process, a driver end that controls the device, and zero or more stream modules between the stream head and the driver end.
Each of these components contains a pair of queues a read queue and a write queue. Message passing is used to transfer data between queues.
The STREAMS structure is shown in Figure 13.14.