免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2891 | 回复: 2
打印 上一主题 下一主题

关于图形化窗口和pty伪终端的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-08 14:56 |只看该作者 |倒序浏览
pty的资料搜了很多,也看了很多,多数太过理论和抽象,结合实际感觉还是没有非常理解,结合图形化窗口请教几个问题(基于unix98 pty):

1. 当打开一个图形化终端窗口(右键--Open Terminal),应该就会创建一个pty,同时打开master端和slave端,bash进程接管slave端(假设为/dev/pts/3),那么对bash进程而言,它是否就打开了两个文件,/dev/ptmx和/dev/pts/3呢?那么在这个窗口中输入和输出的过程,bash进程、slave和master之间的关系职能和数据流是怎么样的?如果是基于GNOME的图形界面,是否还关GNOME什么事?

2. Linux内核是没有图形化实现的,那如果我在内核中增加实现让某个进程创建新的pty,同时打开master和slave,并重定向0,1,2文件描述符到slave,那等该进程回到用户态了,往0,1,2中写入数据要如何体现出来呢?

比较混乱,对这方面比较熟悉的大虾门多多指教啊~

论坛徽章:
0
2 [报告]
发表于 2011-12-09 09:23 |只看该作者
upup。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
3 [报告]
发表于 2011-12-10 09:23 |只看该作者
回复 1# allen303allen

这个其实用远程登录的例子最好理解。tty最复杂的逻辑在于对原始输入的解释,如读到一行才返回给用户,处理特殊字符(intr,quit,et.),展开tab,大小写转换,转义字符等。而这些都是硬件无关的,与硬件相关的是硬件驱动注册的中断处理函数填充输入队列,以及硬件驱动提供的输出函数。只要提供这两点,就有可以作为tty设备(呈现tty设备属性)。换句话说,只要具有输入输出属性的设备都可以作为tty设备。比如将键盘与显示器(被拆分为两部分的tty设备),串口等。

网络显然也具有这种属性。远程登录时服务器端有进程监听端口,当进程从网络中获得输入时可作为tty设备的输入(就好像从键盘上获得输入一样),而内核想从该tty设备输出时则经由进程从网络输入(就像从显示器输出一样)。但问题是,当进程从网络得到数据时,数据已经到用户态了。而内核想输出时,数据也只是在内核态流动。所以监听进程打开伪终端,得到一个master侧的tty的slave侧的tty,然后fork另外一个进程,将其标准输入输出都设为slave端的tty,子进程exec另一个程序,比如bash。这样bash从slave tty设备读,写到slave tty;监听程序从master tty读,写到master tty。当监听程序从网络上读到数据了,就将数据写到master tty,而master tty的输出连在slave tty的输入上,这样数据就流到了slave tty的输入列队上。正常情况是由硬件中断函数提供输入队列上的数据,而这里由监听进程从用户态通过master tty的输出端将数据传到slave tty的输入队列上。而写向slave tty的数据流到了master tty的输入队列上,监听进程可以从master的输入端读到数据。正常情况下向tty写的数据会在内核态直接由硬件驱动程序输出(最终在硬件上传输),这里写向slave tty的数据却流到master tty的输入队列并且被监听进程读到用户态,然后向网络中发送。最终的效果是,bash读写的slave tty,数据从网络中来,数据到网络中去,中间由tty逻辑使其具有刚才所述的一系列属性。普通的tty数据流入流出都由内核态驱动处理,而slave tty数据的流入流出最终却是有用户态处理,然而结果与普通tty无异。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP