探索Linux之 终端模拟器和伪终端交互原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w1857518575/article/details/82670522

写在前面:本人水平有限,很多地方都是自己的理解,如有误导,欢迎指正

# 终端模拟器指的是在linux桌面环境下运行的仿真终端(如下图)

# 终端模拟器为啥叫模拟器呢? 因为真正的终端是全屏显示的黑乎乎的不带窗口的那种,这里带了窗口,是基于linux的X窗口系统上模拟出来的终端设备,在终端上同样可以运行shell,和真的终端功能基本无差别

# 伪终端是啥?伪终端是linux内核模拟出来的假的终端设备对(通过系统调用可以动态创建这种假的终端设备),所谓假的是指这种设备不和真正的硬件设备相关联,只是操作接口和数据解析协议是按照终端设备规范来的

# 通过系统调用创建的伪终端设备对分为主从两个设备,主设备名为/dev/ptmx ,从设备名为/dev/pts0、/dev/pts1.../dev/ptsN等,内核允许动态创建无限制个设备对(所以可以同时打开许许多多个shell窗口)

# 从主设备之间的读写就像管道,外部进程(模拟器进程)写主设备的时候,数据可以从从设备中读取出来(shell从stdin读取命令);进程输出的数据会写入从设备(shell写stdout、stderr),从设备的数据又会写入到主设备,模拟器进程可以通过读主设备来得到进程的输出(读取进程的stdout,stderr)

# 通常一个进程默认打开的stdin stdout stderr文件就是对应打开的伪终端从设备(pts)

#  在桌面应用程序中打开终端模拟器后,做了如下一些操作:

1 模拟器主进程启动,在内核中动态创建伪终端设备对,比如 主设备/dev/ptmx 从设备 /dev/pts1

2 模拟器主进程和X服务器建立连接,创建模拟器窗口,接收和处理从X服务器发过来的鼠标和键盘事件,把键盘事件写给主设备ptmx,同时负责读取ptmx主设备的输出,将输出内容渲染到模拟器窗口上(同样需要和X服务器交互)

扫描二维码关注公众号,回复: 3633864 查看本文章

3 模拟器主进程fork出子进程,将子进程的stdin、stdout、stderr文件描述符定位到从设备/dev/pts1,子进程通过exec系统调用装入shell程序(如bash),此时bash正式登场,从终端(从设备)读取命令执行,bash完全感觉不到自己是运行在伪终端上的~

# 上面的过程我们可以发现一个问题:每打开一个终端模拟器就要启动两个进程,这是很浪费资源的,实际上通过我分析Ubuntu上的gnome-terminal模拟器发现它做了如下优化处理:把模拟器主进程做成一个本地服务器,服务器监听和处理多个主设备,同时负责和X服务器打交道来完成窗口的显示~ 这样每次打开新终端的时候,只会fork出一个新shell进程~

以下为证:

后续还有更多篇对linux终端相关的文章~这篇先到此~

猜你喜欢

转载自blog.csdn.net/w1857518575/article/details/82670522