codecamp

18.8. tty_struct 结构的细节

18.8. tty_struct 结构的细节

tty_struct 变量被 tty 核心用来保持当前的特定 tty 端口的状态. 几乎它的所有的朋友都只被 tty 核心使用, 有几个例外. 一个 tty 驱动可以使用的成员在此描述:

unsigned long flags;
tty 设备的当前状态. 这是一个位段变量, 并且通过下面的宏定义存取:

TTY_THROTTLED
当驱动以及有抑制函数被调用. 不应当被一个 tty 驱动设置, 只有 tty 核心.

TTY_IO_ERROR
由驱动设置当它不想任何数据被读出或写入驱动. 如果一个用户程序试图做这个, 它接收一个 -EIO 错误从内核中. 这常常在设备被关闭时设置.

TTY_OTHER_CLOSED
只由 pty 驱动使用来通知, 当端口已经被关闭.

TTY_EXCLUSIVE
由 tty 核心设置来指示一个端口在独占模式并且只能一次由一个用户存取.

TTY_DEBUG
内核中任何地方都不用.

TTY_DO_WRITE_WAKEUP
如果被设置, 线路规程的 write_wakeup 函数被允许来被调用. 常常在 tty_driver 调用 wake_up_interruptible 函数的同一时间被调用.

TTY_PUSH
只被缺省的 tty 线路规程内部使用.

TTY_CLOSING
tty 核心用来跟踪是否一个端口在那个时刻及时处于关闭过程.

TTY_DONT_FLIP
被缺省的 tty 线路规程用来通知 tty 核心, 它不应当改变 flip 缓冲, 当它被置位.

TTY_HW_COOK_OUT
如果被一个 tty 驱动设置, 它通知线路规程应当"烹调"发送给它的输出. 如果它没有设置, 线路规程成块拷贝驱动的输出; 否则, 它不得不为线路改变将单个发送的字节逐个求值. 这个标志应当通常不被 tty 驱动设置.

TTY_HW_COOK_IN
几乎和设置在驱动中的 flag 变量中的 TTY_DRIVER_REAL_RAW 标志一致. 这个标志通常应当不被 tty 驱动设置.

TTY_PTY_LOCK
pty 驱动用来加锁和解锁一个端口.

TTY_NO_WRITE_SPLIT
如果设置, tty 核心不将对 tty 驱动的写分成正常大小的块. 这个值不应当用来阻止对 tty 端口通过发送大量数据到端口的DoS攻击,

struct tty_flip_buffer flip;
给 tty 设备的 flip 缓冲.

struct tty_ldisc ldisc;
给 tty 设备的线路规程.

wait_queue_head_t write_wait;
给 tty 写函数的 wait_queue. 一个 tty 驱动应当唤醒它,当它可以接收更多数据时.

struct termios *termios;
指向 tty 设备的当前 termios 设置的指针.

unsigned char stopped:1;
指示是否 tty 设备被停止. tty 驱动可以设置这个值.

unsigned char hw_stopped:1;
指示是否 tty 设备的已经被停止. tty 驱动可以设置这个值.

unsigned char low_latency:1;
指示是否 tty 设备是一个低反应周期的设备, 能够高速接收数据. tty 驱动可以设置这个值.

unsigned char closing:1;
指示是否 tty 设备在关闭端口当中. tty 驱动可以设置这个值.

struct tty_driver driver;
当前控制这个 tty 设备的 tty_driver 结构.

void *driver_data;
指针, tty_driver 可以用来存储对于 tty 驱动本地的数据. 这个变量不被 tty 核心修改.

18.7. tty_operaions 结构的细节
18.9. 快速参考
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }