Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3426524
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: LINUX

2007-10-11 18:07:16

规范模式和非规模式
 
规范模式
 
  当 c_lflag 中的 ICANON 标志置位时,则按照规范模式对终端输入数据进行处理。此时输入字符被装配成行,进程以字符行的形式读取。当一行字符输入后,终端驱动会立刻返回。行的定界符有 NL、EOL、EOL2 和 EOF。其中除最后一个EOF将(文件结束)将被处理程序删除外,其余四个字符将被作为一行的最后一个字符返回给调用程序。
  在规范模式下,终端输入的以下字符将被处理: ERASE、KILL、EOF、REPRINT、WERASE和EOL2.
  ERASE 是擦除字符。在规范模式下,当 copy_to_cooked()函数遇到该输入字符时会删除缓冲队列中最后一个字符。若队列中最后一个字符是上一行的字符(NL),则不作任务处理。此后该字符被忽略,不放到缓冲队列中。
  KILL 是删除字符。它删除队列中最后一行字符。此后该字符被忽略掉。
  EOF 是文件结束符。在 copy_to_cooked()函数中该字符以及行结束字符EOL和EOL2都将被当作回车符来处理。在读操作函数遇到该字符将立即返回。EOF字符不会放入队列中而是被忽略。
REPRINT和WERASE是扩展规范模式下识别的字符。REPRINT会让所有未读的输入被输出。而WERASE用于擦除单词(跳过空白字符)。在linux0.11中,程序忽略了对这两个字符的识别处理。
 
非规范模式
  如果ICANON处于复位状态,则终端程序工作在非规范模式下。此时终端程序不对上述字符进行处理,而是将它们当作普通字符处理。输入数据也没有行的概念。
  终端程序何时返回读进程是由MIN和TIME的值确定。这两个变量是c_cc[]数组中的变量。通过修改它们即可改变在非规范模式下进行读字符的处理方式。
  MIN指明读操作最少需要读取的字符数;TIME指定等待读取字符的超时值(计算单位是 1/10秒)。
根据它们的值可分四种情况来说明。
1. MIN>0, TIME>0
  此时TIME是字符超时定时值,在接收到第一个字符后才起作用。在超时之前,若先接收到了MIN个字符,则读操作立该返回。若在收到MIN个字符之前超时了,则读操作返回已经接收的字符数。
此时起码能返回一个字符。因此在接收到一个字符之前secondary空,则读进程序将被阴塞。
2. MIN>0, TIME=0
 
 此时只有在收到到MIN个字符时读操作才返回。否则就无限期等特。
3. MIN=0, TIME>0
  此时TIME是一个读操作超时定时值。当收到一个字符或者已超时,则读操作就立该返回,如果是超时返回,则读操作返回0个字符。
4. MIN=0, TIME=0
  在这种设置下,如果队列中有数据可以读取,则读操作读取需要的字符数。否则立该返回0个字符数
 
阅读(1169) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~