BBS水木清华站∶精华区

发信人: holly (holly), 信区: Linux 
标  题: CCE 实现分析 (1) 
发信站: BBS 水木清华站 (Fri Sep 17 20:58:26 1999) WWW-POST 
 
首先声明: 本人不习惯写长文章...呵呵...懒. BTW,  
今天用 WWW 发文才发现进版画面怎么是 FreeBSD 的 logo ???? 
------------------------------------------------------------------ 
 
CCE 实现分析 (1) - 如何处理 console 的输出 
 
by Holly Lee 1999 
 
本文可以以任何形式传播, 但不得用于任何商业目的. 
 
------------------------------------------------------------------ 
 
本文是针对懂得 Linux 操作和编程的 programmer 写的, 不解释系统调用 
和库函数的内容. 
 
CCE 采用的方法是来自于 KON, 也就是, 它们采用的是同一个方式来处理 
在 console 上的 I/O. 
 
在启动 CCE 时, 大家可以看到, CCE 重新启动了一个新的 shell, 这一点从  
ps 的输出也可以看到, 因此, 这个新的 shell 是作为 CCE 的子进程来运行 
的.  
 
通常, shell 以 terminal (其实这里也就是 console ) 的标准输入/输出/ 
错误输出作为与用户交互的方式. 我们所在 console 上看到的字符 (以及 
输入的字符) 从系统的角度来说, 是向 console 的 device driver 进行读 
写操作的结果. - 其他程序也一样, 除非你特地写一个直接写 Video RAM 
的程序 :-) 
 
但是, 一旦我们启动了 CCE, CCE 会将显示卡设置到图形方式, 显然, console 
的 driver 是无法处理的. 如果还要做到同样地输入/输出, 有几个办法可以 
达到: 1) 改写 console 的驱动程序, 使得它能够处理图形方式, 这要改动 
核心了 - Linux 不支持 STREAM - 在支持 STREAM 的系统中倒是可以考虑 
这种办法(SCO, Solaris, etc) (也许我会试试 :-) ). 2) 同 DOS 下一样, 
利用时钟监视 B800 段的内容, 然后相应地显示汉字. 这两种方式都需要 
root 权限并且可能需要明白或操纵核心的结构. 3) 象 CCE 采用的方式一样, 
重定向子 shell 进程的 File Descriptor 0, 1, 2 到一个 pty! 这利用了 
Unix 中所有子进程将继承父进程的 fd 的特性. 
 
OK, 到这里就基本上可以明白了, dup2 调用可以将子 shell 进程的 fd 0/1/2 
重定向到打开的 pty 的相应的 fd, 这样, 通过定时检查 pty 的 fd, 就可以 
知道是否有东西要输出了.  
 
那么怎么知道有没有东西呢? 答案是: select() ! 呵呵...我认为 select 是 
Unix 中第二有用的系统调用 (第一是 ioctl) 
 
CCE 就是这样定时做检查, 然后自己在屏幕上画字符.......反正要作闪烁的 
光标也要定时器. 
 
 
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.120.13.251]  

BBS水木清华站∶精华区