Chinaunix首页 | 论坛 | 博客
  • 博客访问: 389104
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 560
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-10 08:38
文章分类
文章存档

2016年(32)

2015年(48)

我的朋友

分类: 其他UNIX

2016-03-01 16:26:15

    这两天在研究一个telnet客户端在vxworks下面的实现, 里面用到了pty设备的用法. 为了不忘记, 这里记录一下:
    先查pty的官方解释, pty: preudo-terminal, 其实说白了就是vxwork下提供的一种伪终端机制, 它有点类似于linux下面的tty接口.  在一个类似于telnetd(telnet的服务器)应用程序的开发当中, 它提供了两个process, 其中一个master用来模拟硬件端, 另外一个slave用来模拟用户输入端.
    这样说似乎有点不太容易理解, 举例来说: 我们在做嵌入式开发的时候, 如果和串口通信, 目标板上是有一个实实在在的物理串口的, 这个串口就类似与上面的那个master, 可以用来输出打印, 另外我们还可以通过主机上的secureCRT等串口工具, 然后让键盘的输入,传到物理串口中去, 那么这就类似于上面的那个slave. 
    好, 再说telnetd的实现.
    我们知道, telnetd在主机上的实现, 肯定是需要包含下面这些个步骤的:
    1. 将远端的telnet client传过来的数据通过socket读出来(实际上就是远端telnet client端发送过来的命令啊, 登录信息之类的东西).
    2. 把这些个读出来的东西, 放到本地的命令行解析模块中解析出来成为一条条的命令之后,执行.
    3. 执行完了之后,有一些回显, 比如说命令执行没执行成功, 帮助信息, 等等等等, 再发送回远端给client显示.

    说到这里, 继续类比, 那么对于我们远端的client端来说, 我们希望通过一个类似于串口似的东西, 把输出打印到client那边去. 同时, 对于远端传过来的数据(即命令啥的), 能够像我们的键盘敲命令到串口一样.  
    vxworks的pty设备驱动就是提供这两种类比的具体实现的.
    现在画个图表示一下, telnet客户端的具体实现:
    
    黄色小块里分别代表几个任务, 一一解释如下:
    1. 需要有一个任务不停的从socket中读取远端client传过来的原始字符, 然后加以处理之后写入到pty Master中. (类比, 即键盘在往串口输入数据啦)
    2. 需要有一个任务不停的从pty Master读取执行命令后的回显啊, 打印信息啊之类的数据, 送到socket中去给远端显示.
    3. 从pty slave中读取pty中的数据了之后, 传给cli模块进行解析, 像命令行一样解析.
    4. cli命令行模块执行命令, 然后所有的打印输出, 如printf之类的, 重定向到pty slave这个设备.
    好了, 这里有一点必须要说明的是, pty Master和pty slave不是两个设备, 是一个设备, 是一个虚拟的设备.  也就是说, 你执行函数write(ptyMasterFd), 是可以通过read(ptySlaveFd)读取到数据的!!! 反之亦然.
    
    vxworks是怎么把这个pty设备建立起来的呢, 这个可以从帮助文件中找到:
    1. 先调用ptyDrv( ) 初始化驱动
    2. 调用ptyDevCreate( ) 来创建pty设备, 当然也可以用ptyDevRemove( )来移除一个已经创建过的pty设备.
        在调用ptyDevCreate( )的时候, 举例来说, ptyDevCreate ("/pty/0.", 512, 512); 那么就会生成一个pty Master, 自动命名为"/pty0.M", 并且生成一个pty Slave, 自动命名为"/pty0.S". 然后Master和Slave就可以通过open()函数打开啦! 比如说 open ("/pty0.M", O_RDWR, 0), 就可以得到master的fd了, slave同样.


阅读(4374) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~