STREAMS流机制
基本概念
STREAMS(流)是系统V提供的构造内核设备驱动程序和网络协议包的一种通用方法,对STREAMS进行讨论的目的是为了理解系统V的终端接口,I/O多路转接中poll(轮询)函数的使用,以及基于STREAMS的管道和命名管道的实现。
流在用户进程和设备驱动程序之间提供了一条全双工通路。流无需和实际硬件设备直接会话,流也可以用来构造伪设备驱动程序。在流首(stream head)之下可以压入处理模块,这可以用ioctl命令实现。
STREAMS模块是作为内核的一部分执行的,这类似于设备驱动程序。当构造内核时,STREAMS模块联编进入内核。
STREAMS消息
STREAMS的所有输入和输出都基于消息。流首和用户进程使用read、write、ioctl、getmsg、getpmsg、putmsg和putpmsg交换消息。在流首、各处理模块和设备驱动程序之间,消息可以顺流而下,也可以逆流而上。
在用户进程和流首之间,消息由下列几部分组成:消息内型、可选择的控制信息以及可选择的数据。控制信息和数据由strbuf结构指定:
struct strbuf
{
int maxlen; /* size of buffer */
int len; /* number of bytes currently in buffer */
char *buf; /* pointer to buffer */
}
当用putmsg或putpmsg发送消息时, len指定缓冲区中数据的字节数。当用getmsg或getpmsg接受消息时,maxlen指定缓冲区的长度(使内核不会溢出缓冲区),而len则由内核设置为存放在缓存区中的数据量。消息长度为0是允许的,len为-1说明没有控制信息和或数据。