博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tty的核心位置,与运行调用过程
阅读量:6276 次
发布时间:2019-06-22

本文共 1222 字,大约阅读时间需要 4 分钟。

首先在将tty纳入文件系统后,它将处于核心位置。主要分为三个模块,tty.c(控制),keyboard.c(输入),console.c(输出)模块。

将tty纳入文件系统后,dev_tty1, dev_tty2, dev_tty3三个文件。

现在假设进程SHELL打开了dev_tty1, 把它当做文件一样读写.

具体读入的过程是这样的:

  • SHELL进程调用read,传文件(dev_tty1)的fd和buf到文件系统。
  • 文件系统发现此文件属性为tty设备,就向task_tty发消息准备让tty从外界读入信息。此时shell阻塞,文件系统继续运行,tty正在等待用户输入。
  • task_tty是一个不断运行的进程。tty_dev_read(tty)[tty.c]   --->   keyboard_read(tty)[keyboard.c]   --->    in_process(tty, key)[tty.c]就将现阶段keyboard缓冲区的字符都读入了当前tty的缓冲区了。
  • task_tty接着运行。tty_dev_write(tty)[tty.c]   --->   out_char(tty->console, char)[console.c] && put to the buffer of SHELL
  • 当遇到回车或者字节数足够的时候,tty告诉文件系统,去唤醒SHELL。当然这个过程中都是通过传消息,消息带着各种参数的。
  • SHELL接收到用户输入的参数后,继续运行。

SHELL的运行过程是这样的:

  • 它打开dev_tty1文件设备,然后进入一个while循环内部,
  • 等待输入命令,并对命令做出反应,然后又等待命令。

[IMPORTANT]

最清晰的还是直接看代码阿,这里学到最多的几点:

  • tty包括 tty.c(控制),keyboard.c(输入),console.c(输出)3模块,思路清晰,分工合理。
  • tty完全为文件系统的一个文件了,为外界进程服务,行为受外界shell进程控制。

这两点要好好体会!

补充:tty模块的结构:

task-tty是主运行的进程,并且它有tty.c模块,keyboard.c模块,console.c模块,貌似每个模块都有自己的全局变量,虽然全局变量其他模块也能访问到,但是为了模块化,模块之间尽量不要访问其他模块的全局变量。

每次task-tty主运行进程去控制tty.c,因为tty.c被根据console分成3份,所以其他进程打开tty文件也是打开的这3个,然后操作这三个文件,就好像在操作这三个console。

3个tty负责控制-----从keyboard.c得到输入数据-----使用console.c模块向外输出。
tty负责把输入的数据传给正在阻塞等待的进程。

转载于:https://www.cnblogs.com/jack204/archive/2011/09/29/2195892.html

你可能感兴趣的文章
C++类设计的一些心得
查看>>
tableVIew删除时的delete按钮被挡住时重写的方法
查看>>
读cookie中文字符乱码问题
查看>>
招募译者翻译并发数据结构
查看>>
普通表转换为分区表
查看>>
Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较
查看>>
性能优化总结(六):预加载、聚合SQL应用实例
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>