To a user application, a STREAMS device resembles an ordinary character I/O device, since it has one or more nodes associated with it in the file system, and is opened by calling open(2).
The file system represents each device as a special file. There is an entry in the file for the major device number, identifying the actual device driver that will activate the device. There are corresponding separate minor device numbers for each instance of a particular device, for example for a particular port on a serial card, or a specific pseudo-terminal such as those used by a windowing application.
Different minor devices of a driver cause a separate Stream to be connected between a user process and the driver. The first open call creates the Stream; subsequent open calls respond with a file descriptor referencing that Stream. If the same minor device is opened more than once, only one Stream is created.
However, drivers can support a user process getting a dedicated Stream without the application distinguishing which minor device is used. In this case, the driver selects any unused minor device to be used by the application. This special use of a minor device is called cloning. Chapter 9, STREAMS Drivers describes properties and behavior of clone devices.
Once a device is opened, a user process can send data to the device by calling wait(2), and receive data from the device by calling read(2). Access to STREAMS drivers using read and write is compatible with the traditional character I/O mechanism. STREAMS-specific applications also can call getmsg(2), getpmsg(2), putmsg(2), and putpmsg(2) to pass data to and from the Stream.