2016-03-02
流
流是系统V提供的构造内核设备驱动程序和网络协议包的一种通用方法
流在用户进程和设备驱动程序之间提供了一条全双工通路。流无需和实际硬件设备直接对话,流也可以作为伪设备驱动程序。
用户进程-->流首(系统调用界面)-->设备驱动
在流首之下可以压入处理模块。这可以用ioctl实现。任一个数的处理模块可以压入流。写到流首的数据将顺流而下传送,由设备驱动程序读到的数据则逆流向上传送。
流消息
流的所有输入和输出都是基于消息。流首和用户进程使用read write getmsg getpmsg putmsg putpmsg交换消息。在流首各处理模块个设备驱动程序之间,消息可以顺流而下也可以逆流而上。
在用户进程和流首之间,消息由下列几部分组成:消息类型、可选择的控制信息及可选择的数据。控制信息和数据存放在strbug结构中
struct strbuf {
int maxlen;
int len;
char *buf;
}
当用putmsg或putpmsg发送消息时,len指定缓存中数据的字节数。当用getmsg或getpmsg接收消息时,maxlen制定缓存长度,而len则由内核设置,说明存放在缓存中的数据量。0长消息是允许的,len为-1说明没有控制信息或数据。
控制信息的另一个例子是发送一个无连接的网络消息。为了发送该消息,需要说明消息内容和该消息的目的地址。如果不能将数据和控制一块发送,那么就要某种专门的设计方案。例如ioctl说明地址,然后调用write发送数据。另一种技术可能要求:地址暂用数据的前N个字节,用write写数据。将控制信息与数据分开,并且提供处理两者的函数是处理这种问题的比较清晰的方法。
有约25中不同类型的消息,但是只有少数几种用于用户进程和流首之间。其余的则只在内核中顺流逆流传送。在我们所使用的函数(read write getmsg getpmsg putmsg putpmsg)中只涉及三种消息:
M_DATA IO的用户数据,M_PROTO 协议控制信息,M_PCPROTO 高优先级协议控制信息
流中的消息都有一个排队优先级
高优先级消息>有限波段消息>普通消息
普通消息是优先波段为0的消息。优先波段消息的波段可在1~255之间,波段越高,优先级越高
每个流模块有两个输入队列。一个接受来自它上面模块的消息,另一个接受来自下面模块的消息。在输入队列中的消息按优先级从高到低排列。
putmsg和putpmsg函数
putmsg和putpmsg函数用于将流消息(控制信息或数据,或两者)写至流中。这两个函数区别是后者允许消息指定一个优先波段
int putmsg(int filedes, const struct strbuf *ctlptr, const struct strbuf *dataptr, int flag);
int putpmsg(int filedes, const struct strbuf *ctlptr, const struct strbuf *dataptr, int band, int flag);
对流也可以使用write函数,它等效于不带任何控制信息,flag为0的putmsg