struct tty_operations {
       struct tty_struct * (*lookup)(struct tty_driver *driver, struct inode *inode, int idx);
       //返回对应的tty设备, 若为NULL则返回ERR_PTR, 在tty_mutex函数中调用
       //该项可选,默认为使用ttys array

       int  (*install)(struct tty_driver *driver, struct tty_struct *tty);
       //install一个tty设备到tty驱动的内部表,与lookup和remove法相关联
       //该项可选,默认为使用ttys array

       void (*remove)(struct tty_driver *driver, struct tty_struct *tty);
       //从tty驱动的内部表,remove一个关闭了的tty设备,与lookup和remove法相关联
       //该项可选,默认为使用ttys array

       int  (*open)(struct tty_struct * tty, struct file * filp);
       //当一个特别的tty设备open的时候,将调用该例程;该例程是强制性的,若该例程没有加入operations,open tty的时候将返回ENODEV
       //必须使用的方法

       void (*close)(struct tty_struct * tty, struct file * filp);
       //当tty设备关闭时调用
       //必须使用的方法

       void (*shutdown)(struct tty_struct *tty);
       //在tty在关闭时,若仍持有一个带锁的特殊设备,需要调用该例程,想想我们经常使用的sudo shutdown -r/h/... now就明白了
       //它执行在tty设备释放资源之前,所以可能执行在另一个tty设备持有kref的时候

       void (*cleanup)(struct tty_struct *tty);
       //当一个tty设备在最后一次被关闭和释放资源时,异步地调用该例程,这个例程可以看成shutdown的可休眠的第二部分
       int  (*write)(struct tty_struct * tty, const unsigned char *buf, int count);
       //写函数,不多说
       //可选使用:在需要写的设备中

       int  (*put_char)(struct tty_struct *tty, unsigned char ch);
       //当内核想写单个字符到tty设备时,调用该例程(其实也可以调用write例程,调用时置count为1即可)
       //可选使用:若设备在调用时未提供将使用write法
       //注意:不要直接调用该例程,而应调用tty_put_char

       void (*flush_chars)(struct tty_struct *tty);
       //这个例程调用在tty使用put_char输出很多个字符后
       //可选
       //注意:不要直接调用,调用tty_driver_flush_chars

       int  (*write_room)(struct tty_struct *tty);
       //这个例程返回tty设备将被写入的字符队列长度
       //这个数字受输出缓冲区和输出流的变化影响
       //当有write函数时需要
       //注意:不要直接调用,调用tty_write_room

       int  (*chars_in_buffer)(struct tty_struct *tty);
       //在buffer区中的字符
       int  (*ioctl)(struct tty_struct *tty, unsigned int cmd, unsigned long arg);
       //该例程允许tty设备实施设备特殊的ioctl,若ioctl的数值在cmd中未被设备检测到,将返回ENOIOCTLCMD
       //可选

       long (*compat_ioctl)(struct tty_struct *tty,unsigned int cmd, unsigned long arg);
       //在64位系统中执行32位的ioctl的例程
       //可选

       void (*set_termios)(struct tty_struct *tty, struct ktermios * old);
       //该例程在设备的termios设置改变时通知驱动
       //可选:在持termios lock的时候调用

       void (*throttle)(struct tty_struct * tty);
       //当线程规划快满的时候提醒驱动程序,提示不要再输入字符到tty中
       //可选:通常在tty_throttle()函数中获得termios lock时调用void (*unthrottle)(struct tty_struct * tty);
       //提醒驱动程序,可以输入字符到tty中,因为线程规划空间够用
       //可选:通常在tty_unthrottle()函数中,获得termios lock时调用

       void (*stop)(struct tty_struct *tty);
       //提醒驱动,停止输出字符//可选,注意:不是调用stop_tty
       void (*start)(struct tty_struct *tty);
       //提醒驱动,接着输入字符
       //可选,助于:不是调用start_tty

       void (*hangup)(struct tty_struct *tty);
       //挂起tty,可选
       int (*break_ctl)(struct tty_struct *tty, int state);
       //打开或关闭RS-232口,state为-1则打开,state为0则关闭
       //若该函数执行,则高一级的tty将处理四种ioctls:TCSBRK, TCSBRKP, TIOCSBRK, TIOCCBRK
       //如果驱动程序设置了TTY_DRIVER_HARDWARE_BREAK,接着接口将被称作实际时间,而硬件延迟工作
       //可选:需要收到TCSBRK/BRKP/etc

       void (*flush_buffer)(struct tty_struct *tty);
       //在使用put_char()写入一串字符后,该函数被内核调用
       //可选
       //注意:调用是应为tty_driver_flush_buffer

       void (*set_ldisc)(struct tty_struct *tty);
       //该例程在设备的termios设置改变时通知驱动
       //可选:有BKL (currently)时调用

       void (*wait_until_sent)(struct tty_struct *tty, int timeout);
       //该例程等待设备将其所有字符写入传输FIFO中
       //可选:若设备有FIFO则需要
       //注意:通常使用为tty_wait_until_sent

       void (*send_xchar)(struct tty_struct *tty, char ch);
       //该例程发送一个大端的XON/XOFF给驱动程序
       //可选:如果不提供,之后写函数将被原子锁调用来保持它的序列性

       int (*tiocmget)(struct tty_struct *tty);
       //获得tty的线路设置
       int (*tiocmset)(struct tty_struct *tty,unsigned int set, unsigned int clear);
       //设置tty的线路设置
       int (*resize)(struct tty_struct *tty, struct winsize *ws);
       //当一个termios的请求将改变 请求终端几何(requested terminal geometry)时调用
       //可选:默认行为是 无错误地更新termios structure......

       int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew);
       //当收到一个termiox基于ioctl的信号时调用,将用户空间的请求向下传递
       //这个函数只有当tty包含tty->termiox指针的时候才会执行//可选:持有termios lock的时候调用

       int (*get_icount)(struct tty_struct *tty,struct serial_icounter_struct *icount);
       //当设备收到一个TIOCGICOUNT的信号时调用,将一个内核结构传入使其完成。
       //这个函数只有在提供的时候调用,否则将返回EINVAL

#ifdef CONFIG_CONSOLE_POLL
       int (*poll_init)(struct tty_driver *driver, int line, char *options);
       int (*poll_get_char)(struct tty_driver *driver, int line);
       void (*poll_put_char)(struct tty_driver *driver, int line, char ch);
#endif
       const struct file_operations *proc_fops;
};