可推送模块

将模块推送到流上以提供特殊功能和附加协议层。

在 "流设置" 图 (图 1) 中,左侧的流以最小配置打开,并带有原始 tty 驱动程序,而未添加其他模块。 驱动程序一次从设备接收一个字符,将该字符放入消息中,然后将该消息发送到上游。 流头接收消息,抽取单个字符,然后将其复制到读取进程缓冲区以发送到用户进程,以响应 read 子例程。 当用户进程想要将字符发送回驱动程序时,它会发出 write 子例程,并将字符发送到流头。 头将字符复制到一个或多个多字符消息中,并将这些消息发送到下游。 不需要进一步内核字符处理的应用程序将使用此最小流。

需要更多类似终端的接口的用户需要插入一个模块来执行诸如回传,字符擦除和行杀等功能。 假定流设置图 (图 1) 中显示的 CANONPROC 模块满足此需要,应用程序首先打开原始 tty 流。 然后将 CANONPROC 模块推送到驱动程序上方,以创建图右侧显示的表单的扩展流。 驱动程序不知道模块已放在其上,因此继续在上游发送单字符消息。 该模块从驱动程序接收单字符消息,处理字符,然后将其累积到行字符串中。 将每行放入一条消息中,然后发送到流头。 头现在在它从下游接收的消息中找到多个字符。

流头实现可自动适应此格式更改,并将多字符数据传输到用户空间中。 流头还会跟踪部分传输到用户空间的消息 (例如,当当前用户读缓冲区只能容纳部分当前消息时)。 下游操作不受影响: 头发送和驱动程序接收多字符消息。

流头提供流与用户进程之间的接口。 模块和驱动程序不必实现除 openclose 子例程以外的用户界面函数。