在TTY任务中执行一个循环,这个循环将轮询每一个TTY,处理它的事件,包括从键盘缓冲区读取数据、显示字符等内容。
并非每轮询到某个TTY时,箭头所对应的全部事件都会发生,只有当某个TTY对应的控制台是当前控制台时,它才可以读取键盘缓冲区 (所以图中读取过程使用了虚线)。
和原先程序区别:
1. 每一个TTY都应该有自己的读和写的动作。所以在keyboard_read( )内部,函数需要了解自己是被哪一个TTY调用。我们通过为函数传入一个参数来做到这一点,这个参数是指向当前TTY的指针。
2. 为了让输入和输出分离,被keyboard_read( )调用的in_process( )不应该再直接回显字符,而应该将回显的任务交给TTY来完成,这样,我们就需要为每个TTY建立一块缓冲区,用以放置将被回显的字符。
3. 每个TTY回显字符时操作的CONSOLE是不同的,所以每个TTY都应该有一个成员来记载其对应的CONSOLE信息。
在task_tty ( )中,通过循环来处理每一个TTY的读和写操作,读写操作全都放在了tty_do_read( )和tty_do_write( )两个函数中,这样就让task_tty ( )很简洁,而且逻辑清晰。读操作会调用keyboard_read( ),当然此时已经多了一个参数;写操作会调用out_char ( ),它会将字符写入指定的CONSOLE。