1.规范模式
规范模式很简单:发一个读请求,输入完一行后,终端驱动程序即返回。(终端的行缓冲应该就是通过终端IO函数来实现的)
下列几个条件都会造成读返回。
1.所要求的字节数已读到时,读返回。无需读一个完整的行。如果读了部分行,那么也不会丢失任何信息,下一次读从前一次
读的停止处开始。
2.但读到一个定界符时,读返回。在规范模式中下列字符为解释成行结束:NL、EOL、EOL2和EOF。另外,如若已设置ICRNL,
但未设置IGNCR,则CR字符的作用于NL字符一样,所以它也终止一行。在这5个行定界符中,其中只有一个EOF字符在终端
驱动程序对其进行处理后即被删除。其他四个字符则作为该行的最后一个字符返回给调用者。
3.如果捕捉到信号而且该函数并不自动重启动,则读也返回。
2.非规范模式
关闭termios结构中的c_flag字段的ICANNON标志就能使终端处于非规范模式。在非规范模式中,输入数据并不组成行,不处理
下列特殊字符:ERASE,KILL,EOF,NL,EOL,EOL2,CR,REPRINT,STATUS和WERASE。
在规范模式很简答:系统每次返回一行。但在非规范模式下,系统怎么才能知道在什么时候将数据返回给我们呢?如果它一次返回
一个字节,那么系统开销就很大。在启动读数据之前,往往不知道要读多少数据,所以系统不能总是一次返回多个字节。
解决方法:当已读了指定量的数据后(猜测用于实现终端的全缓冲),或者已经过了给定的时间后,即通知系统返回。这种技术
使用了termios结构中c_cc数组的两个变量MIN和TIME。c_cc数组中的这两个元素的下表VMIN和VTIME。
MIN说明一个read返回前的最小字节数。TIME说明等待数据到达的分秒数。(秒的1/10为分秒)。有下列四种情形。
情形A:MIN>0,TIME>0
TIME说明字节间的计时器,在街道第一个字节时才启动它。在该计时器超时之前,若已接到MIN个字节,则read返回MIN个字节。
如果在街道MIN个字节之前,该计时器已超时,则read返回已接收到的字节。(因为只有在接到第一个字节时才启动,
所以在计时器超时时,至少返回了1个字节)。在这种情形中,在接到第一个字节之前,调用者阻塞。如果在调用read时数据
已经可用,则这如同在read后数据立即被接收到一样。
情形B:MIN>0,TIME == 0
已经接收到MIN个字节时,read才返回。这可以造成read无期限地阻塞。
情形C:MIN == 0,TIME > 0
TIME指定了一个调用read时启动的读计时器。在接收到一个字节或者该计时器超时时,read即返回。如果是计时器超时,则read
返回0.
情形D:MIN==0,TIME == 0
如果有数据可用,则read最多返回所要求的字节数。如果无数据可用,则read立即返回0。
在表列出了非规范模式输入的四种不同情形,在图中,nbytes是read的第三个参数。