📄 00000003.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: holly (holly), 信区: Linux <BR>标 题: CCE 实现分析 (2) <BR>发信站: BBS 水木清华站 (Sat Sep 18 14:27:01 1999) <BR> <BR>CCE 实现分析 (2) - CCE 如何处理输入 <BR> <BR>by Holly Lee 1999 holly_<A HREF="mailto:lee@soim.net">lee@soim.net</A> <BR> <BR>------------------------------------------------------------------------- <BR> <BR>在第一部分中已经讲到过, CCE 利用将其子 shell 进程的 1, 2 fd 重定向到 <BR>pty 来过滤其后代进程向 console 的 I/O, 通过定时的 select 调用来得知是否 <BR>后代的进程已经有向 console 的输出. <BR> <BR>对于输入, 在初始化时 CCE 已经将 console 这个 terminal 设置成 raw 方式了. <BR>在整个检查是否有输入输出的循环中, 如果在 stdin ( fd 为 0 ) 中有内容, <BR>则说明已有东西输入. ( 用 FD_ISSET 作检测 ) <BR> <BR>那么, 怎样检测到底是输入了通常的键盘字符还是作中西文切换, 或者是输入各种 <BR>输入法的字符呢? 在 console 本身的键盘 driver 中, 类似于 Ctrl+Space, <BR>Ctrl+Alt 等等的按键序列是被 discard 的. 也就是说如果在这种情况下, 按这些 <BR>键时将不会产生特殊的输入字符码, 这时, 就需要通过改变或建立按键序列到特殊 <BR>的字符之间映射. 也就是通过改变 keymap 来实现. <BR>对于输入, 在初始化时 CCE 已经将 console 这个 terminal 设置成 raw 方式了. <BR>在整个检查是否有输入输出的循环中, 如果在 stdin ( fd 为 0 ) 中有内容, <BR>则说明已有东西输入. ( 用 FD_ISSET 作检测 ) <BR> <BR>那么, 怎样检测到底是输入了通常的键盘字符还是作中西文切换, 或者是输入各种 <BR>输入法的字符呢? 在 console 本身的键盘 driver 中, 类似于 Ctrl+Space, <BR>Ctrl+Alt 等等的按键序列是被 discard 的. 也就是说如果在这种情况下, 按这些 <BR>键时将不会产生特殊的输入字符码, 这时, 就需要通过改变或建立按键序列到特殊 <BR>的字符之间映射. 也就是通过改变 keymap 来实现. <BR> <BR>在 linux 下, 修改 keymap 的 ioctl 码为 KBSKBENT, 其参数为指向 struct kbentry <BR>的指针; 在 FreeBSD 下则是 PIO_KEYMAP, 参数为 keymap_t 结构的指针. 关于具体的 <BR>内容, 请看相应的头文件. <BR> <BR>改变了 keymap 之后, 在检测到有输入时, 就可以读取输入的字符, 然后根据字符的 <BR>情况相应地做各种处理...... <BR> <BR> <BR>第三部分将分析 vt 之间切换的处理....呵呵, <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.120.13.251] <BR> <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -